Вопрос по dataframe, r – Почему не рекомендуется использовать attach () в R, и что я должен использовать вместо этого?
Предположим, что у нас есть фрейм данныхx
который содержит столбцыjob
а такжеincome
, Для обращения к данным в кадре обычно требуются командыx$job
для данных вjob
столбец иx$income
для данных вincome
колонка.
Однако, используя командуattach(x)
позволяет покончить с именем фрейма данных и тому$
символ при обращении к тем же данным. Как следствие,x$job
становитсяjob
а такжеx$income
становитсяincome
в коде R
Проблема состоит в том, что многие эксперты в R советуют НЕ использоватьattach()
команда при кодировании в R.
Какова главная причина этого? Что следует использовать вместо этого?
job
, или жеincome
, Если вы хотите использовать их, но естьattach()
кадр данныхx
легко перемешать использование объектовx$job
а такжеjob
, или жеx$income
а такжеincome
.
attach
, Я сам им не пользуюсь (опять же, я люблю животных, но тоже не держу их). Когда я думаю оattach
Думаю на длительный срок. Конечно, когда я работаю со сценарием, я знаю его изнутри и снаружи. Но через неделю, месяц или год, когда я возвращаюсь к сценарию, я нахожу накладные расходы на поиск источника определенной переменной, слишком дорогой. Многие методы имеютdata
аргумент, который делает вызов переменных довольно простым (Sensulm(x ~ y + z, data = mydata)
). Если нет, я нахожу использованиеwith
к моему удовлетворению.
Короче говоря, в моей книге метод attach подходит для короткого и быстрого исследования данных, но для разработки сценариев, которые я или другие могли бы использовать, я стараюсь сделать свой код максимально читабельным (и переносимым).
data=
Error: User Rate Limit Exceeded
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
был прикреплен
When to use it:
я используюattach()
когда мне нужна среда, вы получаете в большинстве пакетов статистики (например, Stata, SPSS) работу с одним прямоугольным набором данных за раз.
When not to use it:
Тем не менее, он становится очень запутанным, и код быстро становится нечитаемым, когда у вас есть несколько разных наборов данных, особенно если вы фактически используете R в качестве грубой реляционной базы данных, где различные прямоугольники данных имеют отношение к рассматриваемой проблеме и, возможно, используются в Различные способы сопоставления данных из разных прямоугольников имеют переменные с одинаковыми именами.
with()
функция илиdata=
аргумент для многих функций, являются отличными альтернативами для многих случаев, когдаattach()
заманчиво
with
Error: User Rate Limit Exceededattach
.
attach(data)
несколько раз, например, 5 раз, то вы можете увидеть (с помощьюsearch()
) что ваши данные были прикреплены 5 раз в рабочей среде. Так что если вы отключите (detach(data)
) однажды, все еще будетdata
присутствует 4 раза в окружающей среде. Следовательно,with()/within()
лучшие варианты. Они помогают создать локальную среду, содержащую этот объект, и вы можете использовать ее, не создавая путаницы.