assign(...,envir = ...)和environment(...)=之间的区别

SFu*_*n28 7 environment global r assign

为环境中的名称赋值和设置变量的环境有什么区别?我无法从文档中找到它.

例如:

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
Run Code Online (Sandbox Code Playgroud)

Tom*_*mmy 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
Run Code Online (Sandbox Code Playgroud)