在函数内部附加()

sta*_*ing 21 r scoping

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

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

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

Rom*_*rik 25

诺亚已经指出使用附件是一个坏主意,即使你在一些例子和书籍中看到它.有办法解决.您可以使用所谓的"本地附加" with.在诺亚的虚拟例子中,这看起来像

with(params, print(a))
Run Code Online (Sandbox Code Playgroud)

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

  • +1值得解释`with()`和`within()`做什么.在给出的例子中,`with()`从`params`创建一个环境,然后计算表达式`print(a)`_inside_那个环境.因此,在计算表达式时,`params`的组件是可见的,而不需要'attach()`它们. (4认同)

小智 10

另一种可能性是:

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


Noa*_*oah 8

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

a = 1
params = c()
params$a = 2
myfun <- function(params) {
  attach(params)
  print(a)
  detach(params)
}
myfun(params)
Run Code Online (Sandbox Code Playgroud)

以下对象被屏蔽_by_ .GlobalEnv:

a

# [1] 1
Run Code Online (Sandbox Code Playgroud)

如您所见,R a在此处获取全局属性.

几乎总是一个好主意,避免使用attachdetach尽可能 - 范围最终是难以处理(顺便说一句,它也最好避免命名变量c- R将经常弄清楚你指的是什么,但有这么多那里有其他信件,为什么要冒风险呢?).另外,我发现使用attach/detach的代码几乎不可能破译.