Используете ли вы атрибуты attach() или вызываете переменные по имени или нарезке?
Многие книги и руководства Intro R начинаются с практики присоединения data.frame
, чтобы вы могли вызывать переменные по имени. Я всегда считал целесообразным перечислить переменные с обозначением $
или срезанием квадратной скобки [,2]
. Таким образом, я могу использовать несколько data.frame
, не запутывая их и/или используя итерацию, чтобы последовательно вызвать столбцы, представляющие интерес. Я заметил, что Google недавно опубликовал правила кодирования для R, которые включали строку
1) присоединить: не использовать его
Как люди относятся к этой практике?
Ответы
Ответ 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
, когда он выходит из области видимости.
Имею ли смысл?