附()内部函数

问题描述 投票:21回答:4

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

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

是否有问题呢?如果我已定义的全局C变量命名,并且还定义命名为c名单“PARAMS”,其值的附加命令后,将使用的元素?

r scoping
4个回答
25
投票

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

with(params, print(a))

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


10
投票

另一种可能性是:

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
}

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

这几乎总是一个好主意,以避免使用attachdetach尽可能 - 范围最终成为棘手的处理(顺便说一句,这也是最好的避免命名变量c - R将经常找出你指的是什么,但有这么多的其他字母在那里,为什么要冒险呢?)。另外,我发现代码中使用连接/分离几乎是不可能破译。


0
投票

让 - 吕克的回答让我非常为我做了一个data.frame Dat,而不是作为OP指定的列表的情况下:

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

© www.soinside.com 2019 - 2024. All rights reserved.