为环境中的名称分配值和设置变量的环境有什么区别?我无法从文档中弄明白。
例如:
MyTestFunc = function(x)
{
myVal = "abcde"
# what is this doing? why is myVal not in the global environment after
# this call? I see it adds an environment attribute to the variable,
# but what good is that?
environment(myVal) = globalenv()
assign( "myVal" , myVal , envir = globalenv() )
# this seems to copy graphics:::rect to the current environment which seems
# to contradict the behavior of environment( myVal ) above
environment( rect ) = environment()
# this seems to do the same thing
assign( "rect" , rect , envir = globalenv() )
}
# this prints out rect, but shows <environment: namespace: graphics>!
rect
答案 0 :(得分:6)
assign函数只是将名称绑定到指定环境中的值。
但是环境替换功能做了两件事:它的主要目的是改变函数闭包的环境。该环境是函数的主体代码查找全局可变和函数的位置。通常,这个环境是定义函数的环境(所以如果你在提示符下定义它将使用globalenv)。作为“奖励”,它只为其他对象类型指定.Environment属性。这对于大多数对象来说都是无用的,但公式使用 。
第二件事是它几乎与任何其他替换函数一样工作:如果名称存在于当前环境中,它会直接修改它,否则它会创建一个本地副本并修改它。因此,在您的情况下,它会生成rect函数的本地副本并更改其环境。原始功能保持不变。
# showing names replacement behavior
f <- function() {
names(letters) <- LETTERS
letters # the local modified copy
}
f() # prints changed letters
letters # unchanged
答案 1 :(得分:1)
在您询问并执行的功能中:
# what is this doing? why is myVal not in the global environment after this call?
# I see it adds an environment attribute to the variable, but what good is that?
environment(myVal) = globalenv()
所以你没有对函数中名为“abcde”的myVal
对象做任何事情。您改为在函数环境中创建了一个名为“abcede”的新环境。然后你执行了:
assign( "myVal" , myVal , envir = globalenv() )
它创建了一个名为“myVal”的变量,其字符模式值为“abcde”,从本地函数环境中收集,并将其放入全局环境中。它现在有一个名为“.Environment”的属性。但是,目前还不清楚您的目标是什么,因为环境旨在用于定义功能的范围。为数据对象分配环境简直太奇怪了。变量在环境中,但在设置变量的环境时似乎没有用处。所以我认为你的问题的答案是:......那有什么用?“应该是”它没有任何好处。“