Вы используете attach () или вызываете переменные по имени или нарезке? - PullRequest
26 голосов
/ 21 августа 2009

Многие книги и руководства по интро R начинаются с практики добавления data.frame, чтобы вы могли вызывать переменные по имени. Я всегда считал целесообразным вызывать переменные с пометкой $ или разрезанием по квадратной скобке [,2]. Таким образом, я могу использовать несколько data.frame, не путая их, и / или использовать итерацию для последовательного вызова интересующих столбцов. Я заметил, что Google недавно опубликовал рекомендации по кодированию для R , в которые была включена строка

1) прикрепить: избегать его использования

Как люди относятся к этой практике?

Ответы [ 7 ]

25 голосов
/ 21 августа 2009

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

Пример кода:

> 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
13 голосов
/ 21 августа 2009

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

 with(someDataFrame,  someFunction(...))

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

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

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

8 голосов
/ 21 августа 2009

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

Одной из основных причин того, что присоединение часто используется в учебниках, является то, что оно сокращает код.

7 голосов
/ 09 сентября 2009

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

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

3 голосов
/ 26 января 2012

Точно так же, как сказал Леони, with и within являются идеальными заменителями attach, но я бы не стал полностью отрицать это. Я использую его иногда, когда я работаю непосредственно в приглашении R и хочу протестировать некоторые команды, прежде чем писать их в сценарии. Особенно при тестировании нескольких команд attach может быть более интересной, удобной и даже безвредной альтернативой with и within, так как после запуска attach командная строка становится понятной для вас, чтобы записывать ввод и видеть выходные данные .

Просто убедитесь, что detach ваши данные после того, как вы закончите!

3 голосов
/ 21 августа 2009

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

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

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

2 голосов
/ 02 мая 2011

Хотя я тоже предпочитаю не использовать attach(), он имеет свое место, когда вам нужно сохранить объект (в данном случае data.frame) в течение всей жизни вашей программы, когда у вас есть несколько функций, использующих Это. Вместо того, чтобы передавать объект в каждую функцию R, которая его использует, я думаю, что удобнее хранить его в одном месте и вызывать его элементы по мере необходимости.

Тем не менее, я бы использовал его, только если знаю, сколько памяти у меня есть, и только если я убедился, что я detach() это data.frame, как только он выйдет за рамки.

Имею ли я смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...