Почему не рекомендуется использовать attach () в R, и что я должен использовать вместо этого?
предположим, что у нас есть фрейм данных x
, который содержит столбцы job
и income
. Для обращения к данным в кадре обычно требуются команды x$job
для сведения в и x$income
для сведения в
4 ответов
когда использовать:
Я использую attach()
когда я хочу, чтобы среда, которую вы получаете в большинстве пакетов статистики (например, Stata, SPSS), работала с одним прямоугольным набором данных за раз.
когда не использовать:
однако он становится очень грязным, и код быстро становится нечитаемым, когда у вас есть несколько разных наборов данных, особенно если вы фактически используете R в качестве сырой реляционной базы данных, где разные прямоугольники данных, все относящиеся к рассматриваемой проблеме и, возможно, используемые различными способами сопоставления данных из разных прямоугольников, имеют переменные с одинаковым именем.
на
еще одна причина не использовать 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
the dist
и speed
что ссылка в вычислительной технике time
оригинал (непреобразованных) значений; значения cars$dist
и cars$speed
, когда .
Я думаю, нет ничего плохого в использовании attach
. Я сам не использую его (опять же, я люблю животных, но и не держу их). Когда я думаю о attach
, Я думаю, в долгосрочной перспективе. Конечно, когда я работаю со сценарием, я знаю его вдоль и поперек. Но через неделю, месяц или год, когда я возвращаюсь к сценарию, я нахожу накладные расходы с поиском, где находится определенная переменная, просто слишком дорого. Многие методы имеют
при выполнении attach(data)
несколько раз, например, 5 раз, то вы можете увидеть (с помощью search()
), что ваши данные были присоединены 5 раз в рабочей среде. Поэтому, если вы де-прикрепите (detach(data)
) это один раз, все равно будет data
настоящее время 4 раза в окружающей среде. Следовательно,with()/within()
лучшие варианты. Они помогают создать локальную среду, содержащую этот объект, и вы можете использовать его, не создавая путаницы.