Вы используете присоединение () или зовете по имени переменные или разрезание?

Простой ответ: Вы не можете. Почему Вы пытаетесь? Это, потому что Вы узнали, что необходимо освободить каждый объект, который Вы создаете в той же функции, в которой они создаются? Это обычно корректно, но не всегда, и это - одно из исключений из правила. Лучший способ поместить его состоит в том, что каждый объект должен быть освобожден его владельцем.

, Если у Вас есть функция, которая генерирует объект, как этот, но затем передает его на другую функцию, он не берет владение объекта. Удалите вызов, чтобы освободить и зарегистрировать его, таким образом, Вы (и кто-либо еще, кто использует эту функцию) поймете, что это создает новый объект, из которого код, который называет его, должен взять владение.

26
задан Richard Erickson 7 March 2016 в 21:27
поделиться

5 ответов

Я никогда не использую присоединение. с и в - ваши друзья.

Пример кода:

> N <- 3
> df <- data.frame(x1=rnorm(N),x2=runif(N))
> df$y <- with(df,{
   x1+x2
 })
> df
          x1         x2          y
1 -0.8943125 0.24298534 -0.6513271
2 -0.9384312 0.01460008 -0.9238312
3 -0.7159518 0.34618060 -0.3697712
> 
> df <- within(df,{
   x1.sq <- x1^2
   x2.sq <- x2^2
   y <- x1.sq+x2.sq
   x1 <- x2 <- NULL
 })
> df
          y        x2.sq     x1.sq
1 0.8588367 0.0590418774 0.7997948
2 0.8808663 0.0002131623 0.8806532
3 0.6324280 0.1198410071 0.5125870

Правка: Хадли упоминает преобразование в комментариях. вот код:

 > transform(df, xtot=x1.sq+x2.sq, y=NULL)
       x2.sq       x1.sq       xtot
1 0.41557079 0.021393571 0.43696436
2 0.57716487 0.266325959 0.84349083
3 0.04935442 0.004226069 0.05358049
25
ответ дан 28 November 2019 в 06:40
поделиться

Я предпочитаю использовать с , чтобы получить эквивалент attach для одной команды:

 with(someDataFrame,  someFunction(...))

Это также естественным образом приводит к форме, где подмножество является первым аргументом:

 with(subset(someDataFrame,  someVar > someValue),
      someFunction(...))

, что довольно ясно дает понять, что мы работаем с выбранными данными. И хотя многие функции моделирования имеют аргументы как data , так и подмножества , приведенное выше использование более согласовано, поскольку оно также применимо к тем функциям, которые не имеют данных и подмножество аргументов.

13
ответ дан 28 November 2019 в 06:40
поделиться

Основная проблема с присоединением заключается в том, что это может привести к нежелательному поведению. Предположим, у вас есть объект с именем xyz в вашем рабочем пространстве. Теперь вы присоединяете фрейм данных abc со столбцом с именем xyz. Если ваш код ссылается на xyz, можете ли вы гарантировать, что это ссылки на объект или столбец фрейма данных? Если вы не используете прикрепление, это легко. просто xyz относится к объекту.

8
ответ дан 28 November 2019 в 06:40
поделиться

Я предпочитаю не использовать attach () , так как слишком легко запускать пакет кода несколько раз каждый раз, вызывая attach () . Фрейм данных добавляется к пути поиска каждый раз, без необходимости его расширяя. Конечно, хорошая практика программирования - также detach () в конце блока кода, но об этом часто забывают.

Вместо этого я использую xxx $ y или xxx [, "y" ]. Это более прозрачно.

Другая возможность - использовать аргумент данных, доступный во многих функциях, который позволяет ссылаться на отдельные переменные в пределах фрейма данных. например, lm (z ~ y, data = xxx) .

3
ответ дан 28 November 2019 в 06:40
поделиться

«Прикрепить» - это злое искушение. Единственное место, где это работает , - это установка в классе , где каждому предоставляется один фрейм данных и ожидается, что он напишет строки кода для анализа этого фрейма данных. Пользователь вряд ли когда-либо снова использует эти данные после того, как назначение будет выполнено и передано.

Однако, в реальном мире , к сбору данных в конкретном проекте может быть добавлено больше фреймов данных. . Более того, часто можно копировать и вставлять блоки кода, чтобы использовать их для чего-то подобного. Часто кто-то заимствует что-то, что делал несколько месяцев назад, и не может вспомнить нюансы того, что было вызвано откуда. В этих обстоятельствах человек утонет из-за предыдущего использования слова «прикрепить».

7
ответ дан 28 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: