为何在函数内为R对象设置的属性在返回后消失?
问题原因解析
这是R的两个核心机制共同作用的结果:
- 不可变对象特性:字符串属于R里的原子向量类型,这类对象是不可变的。当你执行
attr(foo, "qux") <- "quo"时,并不是直接给全局的foo添加属性,而是创建了一个带有qux属性的foo副本。 - 局部作用域规则:函数内部默认会把这个新的副本存放在函数自己的局部环境里,不会对全局环境中的原始
foo产生任何影响。所以函数内部打印的是局部副本的属性值,函数执行结束后局部环境被销毁,全局的foo自然还是原来的样子。
如果要真正修改全局的foo,可以用全局赋值操作符<<-,或者直接指定全局环境:
foo <- "foo" (function () { # 方式1:用<<-修改全局变量 foo <<- `attr<-`(foo, "qux", "quo") print(attr(foo, "qux")) })() print(attr(foo, "qux")) # 现在会输出"quo"
或者:
foo <- "foo" (function () { # 方式2:直接操作全局环境中的对象 attr(get("foo", envir = .GlobalEnv), "qux") <- "quo" print(attr(foo, "qux")) })() print(attr(foo, "qux"))
内容的提问来源于stack exchange,提问作者kaorukobo
相关产品推荐
相关产品推荐

