为什么附加对象的更改没有效果?

时间:2016-12-19 16:48:15

标签: r

以下示例显示,即使x在附加后发生了更改,也不会更改值aattach()是否会复制对象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> 

1 个答案:

答案 0 :(得分: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