R 函数内部的attach()

R 函数内部的attach(),r,scoping,R,Scoping,我想给一个函数指定一个params参数,然后附加它,这样每次我引用列表元素a时就可以使用a而不是params$a run.simulation<-function(model,params){ attach(params) # # Use elements of params as parameters in a simulation detach(params) } run.simulation解决此类范围问题的最简单方法通常是尝试一些简单的方法: a = 1 params = c()

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

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

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

a = 1
params = c()
params$a = 2
myfun <- function(params) {
  attach(params)
  print(a)
  detach(params)
}
myfun(params)
如您所见,R在这里拾取全局属性
a


尽可能避免使用
attach
detach
,这几乎总是一个好主意——范围最终很难处理(顺便说一句,最好避免命名变量
c
——R通常会知道您指的是什么,但还有那么多其他字母,为什么要冒险呢?)。此外,我发现使用attach/detach的代码几乎不可能破译。

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

with(params, print(a))

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

另一种可能性是:

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.simulationJean Luc的回答对我的案例帮助很大,因为我有一个data.frame
Dat
,而不是OP中指定的列表:


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

+1值得解释一下
with()
in()。在给定的示例中,
with()
params
创建一个环境,然后在该环境中计算表达式
print(a)
。因此,在计算表达式时,
params
的组件是可见的,而不需要
attach()
它们。非常感谢您提供了清晰的答案。因此,最终起作用的是“myFun”
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
}