Подтвердить что ты не робот

Используете ли вы атрибуты attach() или вызываете переменные по имени или нарезке?

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

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

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

4b9b3361

Ответ 1

Я никогда не пользуюсь приложением. 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

Изменить: hasley упоминает преобразование в комментариях. вот какой код:

 > 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

Ответ 2

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

 with(someDataFrame,  someFunction(...))

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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