R 函数内部的attach()
我想给一个函数指定一个params参数,然后附加它,这样每次我引用列表元素a时就可以使用a而不是params$aR 函数内部的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()
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.frameDat
,而不是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
}