【问题标题】:Difference between assign( ... , envir = ... ) and environment( ... ) =assign( ... , envir = ... ) 和 environment( ... ) = 之间的区别
【发布时间】:2012-01-28 01:29:44
【问题描述】:

在环境中为名称赋值和设置变量的环境有什么区别?我无法从文档中弄清楚。

例如:

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

【问题讨论】:

    标签: r global environment assign


    【解决方案1】:

    assign 函数只是将名称绑定到指定环境中的值。

    但是环境替换函数做了两件事:它的主要目的是改变函数闭包的环境。该环境是函数的主体代码查找全局变量和函数的地方。通常,此环境是定义函数的环境(因此,如果您在提示符处定义它,它将使用 globalenv)。作为“奖励”,它只是为其他对象类型分配 .Environment 属性。这对大多数对象来说几乎没有用,但 被公式使用。

    第二件事是它几乎与任何其他替换函数一样工作:如果名称存在于当前环境中,它直接修改它,否则它创建一个本地副本并修改它。因此,在您的情况下,它会制作 rect 函数的本地副本并更改其环境。原功能不变。

    # showing names replacement behavior
    f <- function() {
      names(letters) <- LETTERS
      letters # the local modified copy
    }
    f() # prints changed letters
    letters # unchanged
    

    【讨论】:

      【解决方案2】:

      在你询问并执行的函数中:

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

      【讨论】:

      • 我似乎无法复制关于 environment(myVal) = globalenv() 的 cmets。如果我确实创建了一个名为“abcde”的环境,那么那个环境在哪里?我如何访问它?看来我只是在 myVal 中添加了一个 .Environment 属性。什么解释了环境(矩形)=环境()?我的目标只是更好地了解环境,以便探索更高级的场景。
      • 您为角色对象添加了环境属性。如果在执行对 MyTestFunc() 的调用后在控制台中键入“abcde”,您将获得包括:attr(,".Environment") &lt;environment: R_GlobalEnv&gt; 的输出。我不知道如何访问该环境。我认为这属于首字母缩略词 DDT。
      • 啊,明白了!我已经更新了我的代码示例。你能看一下吗。 rect 的 assign() 和 environment() 调用是否做同样的事情?为什么 rect 打印输出显示的环境与 globalenv 不同?
      • 我敢打赌,在定义之后你再也没有执行 MyTestFunc。仅仅将它写在一个函数中不会导致它被执行。当我执行 MyTestFunc() 时,rect 的环境变为
      • 你说得对,我从未执行过它。我刚打印出来。对于第一个问题,assign() 和 environment() 调用 rect 做同样的事情是否正确?
      猜你喜欢
      • 2023-03-23
      • 2015-02-10
      • 2014-02-07
      • 2022-06-17
      • 2023-03-19
      • 1970-01-01
      • 2020-03-03
      • 2011-08-12
      • 2021-12-25
      相关资源
      最近更新 更多