下面的例子是我不断寻求更好地预测R会做什么的另一个例子。尽管已经阅读了关于匹配和范围任意次数的材料,但我仍然难以传递变量,而且似乎很明显我还缺少其他规则,或者我误解了我的一些规则,据说,得知。
此处 //reinitializing
mgm = new Specialties []{};
mgm[0].setName("abc");
四次致电ff()
。这些调用的输出如下。实例1和实例2证实了我的期望。他们在gg()
的执行环境中找到aa
,在ff
的函数定义的封闭环境中找到cc
。但实例2和3让我感到惊讶。对于3,我不确定会发生什么,因为我对通过gg
传递的变量是否保留其名称仍然有点模糊。如果没有,我认为垃圾收集器可能会得到它。但我真的希望4将一个名为...
的变量传递给函数,值为13,但事实并非如此。
我的cc
原始版本中没有gg()
ls()
。当我添加list2env()
时,它似乎表明ls()
传递了一个...
对象,其中...
无法访问,而且在函数体中的cc范围内。请注意,在我添加all.names = TRUE之前,ls()没有显示cc
。然后我添加了list2env(),条件是...
中存在某些内容。但最好的我可以说,这根本不起作用。
所以,有三个问题:
...
中通常可用的...
分配了一个名称
功能好像这个名字是正式的?的
aa <- 2
bb <- 3
cc <- 11
gg <- function(X, ...){
if(length(alist(...)) > 1){list2env(alist(...), envir = parent.frame())}
env_vars <- ls(all.names=TRUE)
out <- cc * X
print(env_vars)
cat(X, ", out = ", out, "\n", sep="")
}
ff <- function(){
aa <- 5
bb <- 7
cc <- 13
gg(aa) \# 1
gg(X=aa) \# 2
gg(aa, cc) \# 3
gg(aa, cc=cc) \# 4
}
ff()
[1] "..." "X"
5, out = 55
[1] "..." "X"
5, out = 55
[1] "..." "X"
5, out = 55
[1] "..." "X"
5, out = 55
非常感谢你!修改格式的人。
答案 0 :(得分:0)
这看起来很奇怪,但经过一些试验和错误我们发现
L <- list(...)
list2env(L, environment())
如果实际参数被命名,会将...
变量注入当前环境。似乎创建一个中间变量来保存列表很重要,这里L
。
一般情况下,如果实际参数名为:
,则可以像这样使用with
g <- function(X, ...) with(list(...), {
print(ls())
})
g(1, cc = 2)
## [1] "cc"