21

我想给一个函数提供一个 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 的元素,那么在附加命令之后将使用其值吗?

4

4 回答 4

25

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

with(params, print(a))

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

于 2011-04-27T07:29:07.603 回答
11

另一种可能是:

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
}
于 2012-07-16T13:41:27.807 回答
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 经常会弄清楚你指的是什么,但是有很多其他信件,为什么要冒险?)。此外,我发现使用附加/分离的代码几乎不可能破译。

于 2011-04-27T01:08:30.260 回答
0

对于我有一个 data.frameDat而不是 OP 中指定的列表的情况,Jean-Luc 的回答极大地帮助了我:

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

于 2019-02-06T17:40:36.827 回答