2016-12-19 2 views
0

Следующий пример показывает, что после его добавления изменяется только x, значение a не изменяется. Делает attach() сделать копию объекта x? Есть ли способ мутировать x, сохраненный attach()?Почему изменения в прикрепленном объекте не влияют?

R> x=list(a=1,b=2) 
R> attach(x) 
R> search() 
[1] ".GlobalEnv"  "x"     "package:stats"  
[4] "package:graphics" "package:grDevices" "package:utils"  
[7] "package:datasets" "package:methods" "Autoloads"   
[10] "package:base"  
R> x$a=2 
R> search() 
[1] ".GlobalEnv"  "x"     "package:stats"  
[4] "package:graphics" "package:grDevices" "package:utils"  
[7] "package:datasets" "package:methods" "Autoloads"   
[10] "package:base"  
R> a 
[1] 1 
R> 
+4

От '? Attach', *" База данных на самом деле не прикреплена. Вместо этого создается новая среда в пути поиска и элементах списка (включая столбцы кадра данных) или объекты в файле сохранения или среда будет скопирована в новую среду.Если вы используете << или назначить для присоединения к вложенной базе данных, вы изменяете только прикрепленную копию, а не исходный объект. (Обычное назначение поместит модифицированную версию в рабочее пространство пользователя: см. примеры.) По этой причине приложение может привести к путанице. *. – nrussell

+0

@nrussell, пост как ответ? –

+0

Я думаю, что вопрос, вероятно, можно просто удалить; вся информация указана в документации. Если вы не согласны, напишите ответ. – nrussell

ответ

2

Когда мы attach(x), что создает новую запись в списке поиска называется x но переменная x все еще относимся к первоначальному списку, который находится в рабочей области. Таким образом, если мы назначаем x$a, мы присваиваем оригиналу x в рабочей области, а не в новую запись в списке поиска. Даже если мы удалим этот исходный список x, синтаксис x$a не может использоваться для ссылки на a в новой записи в списке поиска; однако есть альтернативы, которые будут работать. Сначала запустите новый сеанс R, чтобы убедиться, что нет остаточного мусора. Тогда попробуйте это:

# define a list and attach it 
x <- list(a = 1, b = 2) 
attach(x) 

# a few different ways of assigning to a in x on the search list 


# 1 
assign("a", 99, "x") 
a 
## [1] 99 

# 2 
env_x <- as.environment("x") 
env_x$a <- 100 
a 
## [1] 100 

# 3 
a <<- 200 
a 
## [1] 200 
env_x$a 
## [1] 200 

# the a in the original list x is unchanged 
x$a 
## [1] 1 

Это достаточно запутанным и надоедливым, что обычный совет просто не использовать attach в первую очередь.

+0

К сожалению, 'attach()' используется в 'attachNamespace()', который, в свою очередь, вызывается 'library()'. Если 'attach()' не следует использовать, следует ли 'library()' использовать лучший способ для внешних пакетов? – user1424739

+1

Это относится к пользователю, использующему его напрямую. –

+0

Не могли бы вы прокомментировать использование '<< -'? Мне непонятно, как он находит 'env_v $ a' только с' a'. – user1424739

Смежные вопросы