Почему не рекомендуется использовать attach () в R, и что я должен использовать вместо этого?
20441 просмотра
4 ответа
Давайте предположим, что у нас есть фрейм данных, x
который содержит столбцы job
и income
. Для обращения к данным в кадре обычно требуются команды x$job
для данных в job
столбце и x$income
для данных в income
столбце.
Однако использование команды attach(x)
позволяет покончить с именем фрейма данных и $
символом при обращении к одним и тем же данным. Следовательно, x$job
становится job
и x$income
становится income
в коде R.
Проблема в том, что многие эксперты в R советуют НЕ использовать attach()
команду при кодировании в R.
Какова главная причина этого? Что следует использовать вместо этого?
Автор: SavedByJESUS Источник Размещён: 12.11.2019 09:06Ответы (4)
40 плюса
Когда его использовать:
Я использую, attach()
когда хочу, чтобы среда, которую вы получаете в большинстве пакетов статистики (например, Stata, SPSS), работала с одним прямоугольным набором данных за раз.
Когда его не использовать:
Тем не менее, он становится очень запутанным, и код быстро становится нечитаемым, когда у вас есть несколько разных наборов данных, особенно если вы фактически используете R в качестве грубой реляционной базы данных, где различные прямоугольники данных имеют отношение к рассматриваемой проблеме и, возможно, используются в Различные способы сопоставления данных из разных прямоугольников имеют переменные с одинаковыми именами.
with()
Функция или data=
аргумент многих функций, является прекрасной альтернативой многих случаев , когда attach()
это заманчиво.
22 плюса
Еще одна причина не использовать attach
: он позволяет получить доступ к значениям столбцов фрейма данных только для чтения (доступа), и так, как они были при подключении. Это не сокращение для текущего значения этого столбца. Два примера:
> head(cars)
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
> attach(cars)
> # convert stopping distance to meters
> dist <- 0.3048 * dist
> # convert speed to meters per second
> speed <- 0.44707 * speed
> # compute a meaningless time
> time <- dist / speed
> # check our work
> head(cars)
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
Никакие изменения не были внесены в cars
набор данных , даже хотя dist
и speed
были назначены.
Если явно назначен обратно на набор данных ...
> head(cars)
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
> attach(cars)
> # convert stopping distance to meters
> cars$dist <- 0.3048 * dist
> # convert speed to meters per second
> cars$speed <- 0.44707 * speed
> # compute a meaningless time
> cars$time <- dist / speed
> # compute meaningless time being explicit about using values in cars
> cars$time2 <- cars$dist / cars$speed
> # check our work
> head(cars)
speed dist time time2
1 1.78828 0.6096 0.5000000 0.3408862
2 1.78828 3.0480 2.5000000 1.7044311
3 3.12949 1.2192 0.5714286 0.3895842
4 3.12949 6.7056 3.1428571 2.1427133
5 3.57656 4.8768 2.0000000 1.3635449
6 4.02363 3.0480 1.1111111 0.7575249
dist
и speed
то, на что ссылаются в вычислениях, time
являются исходными (не преобразованными) значениями; значения cars$dist
и cars$speed
когда cars
был прикреплен.
14 плюса
Я думаю, что нет ничего плохого в использовании attach
. Я сам им не пользуюсь (опять же, я люблю животных, но тоже не хожу). Когда я думаю attach
, я думаю о долгосрочной перспективе. Конечно, когда я работаю со сценарием, я знаю его внутри и снаружи. Но через неделю, месяц или год, когда я возвращаюсь к сценарию, я нахожу накладные расходы на поиск, откуда берется определенная переменная, просто слишком дорого. У многих методов есть data
аргумент, который делает вызов переменных довольно простым (sensu lm(x ~ y + z, data = mydata)
). Если нет, то я найду применение with
к моему удовлетворению.
Короче говоря, в моей книге метод attach подходит для короткого и быстрого исследования данных, но для разработки сценариев, которые я или другие могли бы использовать, я стараюсь сделать свой код максимально читаемым (и переносимым), насколько это возможно.
Автор: Roman Luštrik Размещён: 08.04.2012 09:0410 плюса
Если вы выполняете attach(data)
несколько раз, например, 5 раз, то вы можете видеть (с помощью search()
), что ваши данные были прикреплены 5 раз в рабочей среде. Так что если вы удалите его ( detach(data)
) один раз, он все равно будет data
присутствовать 4 раза в среде. Следовательно, with()/within()
есть лучшие варианты. Они помогают создать локальную среду, содержащую этот объект, и вы можете использовать ее, не создавая путаницы.
Вопросы из категории :
- r Как получить доступ к последнему значению в векторе?
- r Пакеты оптимизации для R
- r Есть ли у R такие операторские операции, как Perl qw ()?
- r Библиотека / инструмент для рисования тройных / треугольных графиков
- r Участки без заголовков / надписей в R
- r Расчет скользящей средней
- dataframe Разница между скобками [] и двойной скобкой [[]] для доступа к элементам списка или кадра данных
- dataframe Уровни коэффициента отбрасывания в заданном кадре данных
- dataframe Как отсортировать фрейм данных по нескольким столбцам
- dataframe Как объединить (объединить) кадры данных (внутренний, внешний, левый, правый)?
- dataframe Фильтрация строк данных.файла по логическому условию
- r-faq Проверить, содержит ли вектор данный элемент
- r-faq Поиск всех позиций для нескольких элементов в векторе