2011-04-26 46 views
20

我想给一个params参数设置为一个函数,然后将其固定,这样我可以使用的,而不是PARAMS $一个每次我指的是列表元素的。连接()内的功能

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

这是否有问题?如果我定义了一个名为c的全局变量,并且还定义了列表“params”中名为c的元素,它的值将在attach命令之后使用?

回答

25

诺亚已经指出,使用附加是一个坏主意,即使你看到它在一些例子和书。有一条路。您可以使用名为with的“本地连接”。在挪亚的虚拟的例子,这看起来像

with(params, print(a)) 

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

+4

+1值得说明的是什么'有()'和'内()'做。在给出的例子中,'with()'从'params'创建一个环境,然后评估表达式'print(a)'_inside_那个环境。因此,当评估表达式时,“params”的组件是可见的,而不需要“附加()”它们。 – 2011-04-27 09:51:02

+0

非常感谢您的明确答案。 – 2011-04-27 18:47:39

+0

所以最后工作的是'myFun 2011-04-30 19:00:37

8
解决范围的问题,像这通常是尝试一些简单了

最简单的方法:

a = 1 
params = c() 
params$a = 2 
myfun <- function(params) { 
    attach(params) 
    print(a) 
    detach(params) 
} 
myfun(params) 

以下对象(S)被屏蔽_by_ .GlobalEnv

a

# [1] 1 

正如你看到的,R是捡个e全球属性a在这里。

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

6

另一种可能性是:

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 
}