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

时间:2011-12-26 15:56:05

标签: r global environment 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

2 个答案:

答案 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”的属性。但是,目前还不清楚您的目标是什么,因为环境旨在用于定义功能的范围。为数据对象分配环境简直太奇怪了。变量在环境中,但在设置变量的环境时似乎没有用处。所以我认为你的问题的答案是:......那有什么用?“应该是”它没有任何好处。“

相关问题