【问题标题】:Modifying many objects in enclosing environment of a function在函数的封闭环境中修改许多对象
【发布时间】:2015-05-12 14:28:51
【问题描述】:

通常在 R 中,函数首先创建一个新环境并在其中执行它的工作。我想要一个函数来定义/重新初始化函数的父环境可以访问的很多东西。

我知道我可以将<<- 运算符用于特定变量,但这里我有很多函数、变量,甚至是定义的环境,我想选择一个参数在函数中是否使用父环境。

目前,我正在调用该函数,然后根据需要附加它的环境,如下所示:

init <- function(){
    things <- 0
    ICI <<- environment()
    success <- TRUE
    return(success)
}
init();attach(ICI)

它工作正常,但他们是一种将函数的​​当前环境更改为父环境的方法,以便我可以定义函数的参数来打开或关闭此行为吗?

【问题讨论】:

  • environmentparent.env 都有设置器,例如environment(fun) &lt;- value;不过,手册页说要小心。
  • @Neal Fultz 虽然两者都不允许将当前环境设置为父环境之一。 parent.env(ICI) &lt;- ICI 导致冻结(我猜是无限递归)。
  • environment(ICI) &lt;- parent.env(ICI) 也许?

标签: r function


【解决方案1】:

其实attach可以在函数内部调用,并且返回父环境时附件不会被销毁,所以下面允许设置回父环境中的所有内容:

init <- function(transparent=FALSE){
    # compute values
    things <- 0
    success <- TRUE

    # follow "set back variables" argument
    ICI <- environment()
    if(transparent){
        attach(ICI) # everything is transmitted to the parent environment
    }else{
        ICI <<- ICI # only transmit a handle for the environment
    }
    return(success)
}
init();# attach(ICI)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多