【问题标题】:attach() inside functionattach() 函数内部
【发布时间】:2011-04-26 23:49:41
【问题描述】:

我想给一个函数提供一个 params 参数,然后附加它,这样我就可以在每次引用列表元素 a 时使用 a 而不是 params$a。

run.simulation<-function(model,params){
attach(params)
#
# Use elements of params as parameters in a simulation
detach(params)
}

这有问题吗?如果我定义了一个名为 c 的全局变量,并且还定义了列表 "params" 的一个名为 c 的元素,它的值将在附加命令之后使用?

【问题讨论】:

    标签: r scoping


    【解决方案1】:

    Noah 已经指出使用 attach 是一个坏主意,即使您在一些示例和书籍中看到它。有办法解决。您可以使用名为with 的“本地附加”。在 Noah 的虚拟示例中,这看起来像

    with(params, print(a))
    

    这将产生相同的结果,但更整洁。

    【讨论】:

    • +1 值得解释 with()within() 的作用。在给出的示例中,with()params 创建一个环境,然后计算表达式print(a) inside 该环境。因此,params 的组件在计算表达式时是可见的,而不需要 attach() 它们。
    • 非常感谢您提供清晰的答案。
    • 所以最终起作用的是 'myFun
    【解决方案2】:

    另一种可能是:

    run.simulation <- function(model, params){
        # Assume params is a list of parameters from 
        # "params <- list(name1=value1, name2=value2, etc.)"
        for (v in 1:length(params)) assign(names(params)[v], params[[v]])
        # Use elements of params as parameters in a simulation
    }
    

    【讨论】:

      【解决方案3】:

      解决此类范围问题的最简单方法通常是尝试一些简单的方法:

      a = 1
      params = c()
      params$a = 2
      myfun <- function(params) {
        attach(params)
        print(a)
        detach(params)
      }
      myfun(params)
      

      以下对象被 _by_ .GlobalEnv 屏蔽:

      a

      # [1] 1
      

      如你所见,R 在这里获取了全局属性a

      尽可能避免使用attachdetach 几乎总是一个好主意——作用域最终难以处理(顺便提一下,最好避免命名变量c——R 经常会弄明白您指的是什么,但是那里有很多其他字母,为什么要冒险呢?)。此外,我发现使用附加/分离的代码几乎无法破译。

      【讨论】:

        【解决方案4】:

        Jean-Luc 的回答极大地帮助了我,因为我有一个 data.frame Dat 而不是 OP 中指定的列表:

        for (v in 1:ncol(Dat)) assign(names(Dat)[v], Dat[,v])

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          • 2020-09-01
          • 2014-04-14
          • 2013-01-02
          • 2013-11-19
          • 2017-12-20
          • 1970-01-01
          相关资源
          最近更新 更多