2012-04-08 2 views
34

Предположим, что у нас есть кадр данных x, который содержит столбцы job и income. Для данных в кадре обычно требуются команды x$job для данных в столбце job и x$income для данных в столбце income.Почему не рекомендуется использовать attach() в R, и что я должен использовать вместо этого?

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

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

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

+4

Одна из проблем заключается в том, что у вас могут быть другие объекты в памяти, называемые (в вашем примере) 'job' или' income'. Если вы хотите использовать их, но имеете 'attach()' ed data frame 'x', легко смешивать использование объектов' x $ job' и 'job', или' x $ income' и 'income'. –

ответ

34

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

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

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

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

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

+5

+1 за предложение 'with'. Если вы хотите сохранить ввод/опечатки, которые лучше, чем 'attach'. – Wayne

12

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

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

+1

+1 для указания того, что 'data =' может выполнить ту же задачу с помощью различных команд, которые у нее есть. – Wayne

17

Другая причина не использовать 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 был установлен.

+0

Что мне не нравится, так это то, что вам все равно нужно использовать «cars $» в левой части уравнения. – skan

7

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