2014-10-21 2 views
1

Я чувствую, что постоянно в R, я получаю странные конфликты имен между прикрепленными файлами данных и другими объектами, прикрепляет/отключает работу не так, как ожидалось (только две копии одного и того же фреймворка прикреплены, даже конечно, если они были идентичны или нет) и целый ряд проблем с мягким типизированным языком. Код, который работал час назад, внезапно вызывает новые ошибки и т. Д.Именование конфликтов в R при использовании attach

Есть ли лучший способ справиться с такими вещами? Неужели я теряю эффективность, если я придерживаюсь присвоения именным фреймам одиночными буквами, а затем вообще не прикреплен?

+15

Вы, безусловно, не должны использовать attach(); это обычно рецепт путаницы. – joran

+1

НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ПРИНЦИП! Не доверяйте книгам, которые его используют. –

+0

Причина, по которой вам не требуется attach(), заключается в том, что часто многие команды (например, 'lm') имеют аргумент' data = ', где вы можете передать имя data.frame, а R будет разрешать переменные в вашей формуле в пределах этого data.frame, или вы можете использовать функцию типа 'with()', чтобы избежать повторного ввода имени data.frame много раз. По крайней мере, обязательно используйте 'detach()', чтобы удалить каждый файл data.frame you 'attach()', как только вы закончите с ним. – MrFlick

ответ

6

присоединяет/отсоединяется (SIC) не работает, как ожидалось

Как отметил Joran и BondedDust, используя attach всегда плохая идея, потому что это вызывает глупые, непонятные ошибки как вы нашли.

называющие dataframes с одиночными буквами

Не делайте этого, либо! Дайте вам переменные значащие имена, чтобы ваш код был легче понять, когда вы вернетесь к нему через шесть месяцев.


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

Например,

some_sample_data <- data.frame(x = 1:10, y = runif(10)) 

Подменю

Повторный набор текста, тяжелая работа:

some_sample_data[some_sample_data$x > 3 & some_sample_data$y > 0.5, ] 

Легче альтернативы с помощью subset:

subset(some_sample_data, x > 3 & y > 0.5) 

Изменение порядка

Многократное типирование, тяжелая работа:

order_y <- order(some_sample_data$y) 
some_sample_data[order_y, ] 

Легче использованием arrange из plyr:

arrange(some_sample_data, y) 

Преобразуя

Повторные ввод, ха й работа:

some_sample_data$z <- some_sample_data$x + some_sample_data$y 

Легче использование with, within или mutate (последняя один из plyr):

some_sample_data$z <- with(some_sample_data, x + y) 
some_sample_data <- within(some_sample_data, z <- x + y) 
some_sample_data <- mutate(some_sample_data, z = x + y) 

Моделирование

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

повтором типирование, тяжелая работа:

lm(some_sample_data$y ~ some_sample_data$x) 

Использование аргумента данных:

lm(y ~ x, data = some_sample_data) 

Вы можете увидеть все функции в пакете статистики, которые имеют аргумент данных с помощью:

library(sig) 
stats_sigs <- list_sigs(pkg2env(stats)) 
Filter(function(fn) "data" %in% names(fn$args), stats_sigs) 
+0

Очень всеобъемлющий. Спасибо. –

+0

Следует упомянуть, что обычно 'subset()' является плохой идеей в неинтерактивном, программном использовании: http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset – landroni

0

Лучше использовать новую среду для ряда данных. Например, я обычно создаю среду e с помощью этой команды.

e <- new.env() 

Тогда вы можете получить доступ к отдельным лицам в среде с e$your_var.

Другое преимущество:

  1. Вы можете использовать eapply на элемент среды.
  2. Ls (е)
  3. гт (список = е)
  4. Это избежать конфликта между вашей локальной переменной и переменной функции, которую вы хотите создать 5 ...
Смежные вопросы