Почему не рекомендуется использовать attach () в R, и что я должен использовать вместо этого?

Предположим, что у нас есть кадр данных x который содержит job столбцов и income . Для обращения к данным в кадре обычно требуются команды x$job для данных в столбце job и x$income для данных в столбце income .

Однако использование команды attach(x) позволяет уничтожить имя фрейма данных и символ $ при обращении к тем же данным. Следовательно, x$job становится job а x$income становится income в R-коде.

Проблема в том, что многие эксперты из R советуют НЕ использовать команду attach() при кодировании в R.

В чем главная причина этого? Что следует использовать вместо этого?

4 Solutions collect form web for “Почему не рекомендуется использовать attach () в R, и что я должен использовать вместо этого?”

Когда его использовать:

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

Когда не использовать его:

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

Функция with() или аргумент data= для многих функций являются отличными альтернативами во многих случаях, когда attach() заманчиво.

Еще одна причина не использовать 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 

Никакие изменения не были внесены в dataset cars несмотря на то, что были назначены speed и speed .

Если явно назначено обратно в dataset …

 > 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 .

Я думаю, что нет ничего плохого в использовании attach . Я сам его не использую (опять же, я люблю животных, но не оставляю их). Когда я думаю о attach , я думаю, что надолго. Конечно, когда я работаю со сценарием, я знаю его внутри и снаружи. Но через неделю, месяц или год, когда я вернусь к сценарию, я нахожу накладные расходы с поиском, где определенная переменная, слишком дорого. Множество методов имеет аргумент data который делает вызывающие переменные довольно легкими (sensu lm(x ~ y + z, data = mydata) ). Если нет, я нахожу использование with моим удовлетворением.

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

Если вы выполняете attach(data) несколько раз, например, 5 раз, то вы можете увидеть (с помощью search() ), что ваши данные были прикреплены 5 раз в рабочей области. Поэтому, если вы один раз detach(data) ( detach(data) ), все равно будут присутствовать data 4 раза в среде. Следовательно, with()/within() являются лучшими опциями. Они помогают создать локальную среду, содержащую этот объект, и вы можете использовать ее без каких-либо путаниц.

  • Как создать список фреймов данных?
  • Числовая сложность сравнения в R
  • R: Перестановки и комбинации с / без замены и для отдельных / неявных элементов / мультимножества
  • Элегантный способ проверить недостающие пакеты и установить их?
  • Как вы конкретно заказываете ось ggplot2 x вместо алфавитного порядка?
  • Удаление дублированных строк
  • Постройте два графика в одном графике в R
  • Извлечь максимальное значение в каждой группе в кадре данных
  • Есть ли встроенная функция для поиска режима?
  • Порядок приоритета оператора при использовании «:» (двоеточие)
  • as.Date возвращает NA при преобразовании из 'ddmmmyyyy'
  • Interesting Posts

    Как использовать сервлет-фильтр в Java для изменения URL-адреса входящего сервлета?

    Как получить имя дня в ячейке в Excel?

    Вызов методов с необязательными параметрами посредством отражения

    Generics: List совпадает с List ?

    Ссылка на компьютеры по их имени между ОС X и операционными системами Windows

    Как передать объект из формы1 в form2 и обратно в form1?

    Excel VBA для экспорта выбранных листов в PDF

    Как написать фигурные скобки {и} в Emacs на Mac OS X со скандинавской раскладкой клавиатуры?

    Запуск сценария при подключении к беспроводной сети

    значения группы mongodb по нескольким полям

    Моя Windows XP всегда загружается в chkdisk

    Язык распознавания речи Windows 8

    Проверка / проверка целостности PDF-файлов

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

    Ошибка: «Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами»

    Давайте будем гением компьютера.