我想给一个函数提供一个params参数然后附加它,这样我每次引用list元素时都可以使用a而不是params。
run.simulation<-function(model,params){
attach(params)
#
# Use elements of params as parameters in a simulation
detach(params)
}
这有问题吗?如果我已经定义了一个名为c的全局变量,并且还定义了一个名为c的列表“params”的元素,其值将在attach命令之后使用?
答案 0 :(得分:25)
Noah已经指出使用附件是一个坏主意,即使你在一些例子和书籍中看到它。有办法解决。您可以使用名为with
的“本地附加”。在诺亚的虚拟例子中,这看起来像
with(params, print(a))
将产生相同的结果,但更整洁。
答案 1 :(得分:9)
另一种可能性是:
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
}
答案 2 :(得分:8)
解决范围问题的最简单方法通常是尝试简单的方法:
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
。
尽可能避免使用attach
和detach
几乎总是一个好主意 - 范围最终难以处理(顺便提一下,最好避免命名变量c
- - R经常会弄清楚你指的是什么,但那里还有很多其他的信件,为什么要冒这个风险?)。另外,我发现使用attach / detach的代码几乎不可能破译。
答案 3 :(得分:0)
Jean-Luc的回答对我有一个data.frame Dat
而不是OP中指定的列表的情况极大地帮助了我:
for (v in 1:ncol(Dat)) assign(names(Dat)[v], Dat[,v])