【发布时间】:2018-09-06 14:28:16
【问题描述】:
下面的示例是我不断寻求更好地预测 R 将做什么的另一个实例。尽管已经多次阅读了有关匹配和范围界定的材料,但我仍然难以传递变量,而且很明显,要么我缺少其他规则,要么我误解了我所拥有的一些规则,据说,学习了。
这里ff() 调用了gg() 四次。这些调用的输出如下。这里实例 1 和 2 证实了我的期望。他们在ff的执行环境中找到aa,在gg的函数定义的封闭环境中找到cc。但是实例 2 和实例 3 让我感到惊讶。对于 3,我不确定会发生什么,因为我对通过 ... 传递的变量是否保留其名称仍然有些模糊。如果没有,我认为垃圾收集器可能会得到它。但我真的希望 4 将一个名为 cc 的变量传递给函数,其值为 13,但事实并非如此。
我原来的gg() 没有ls() 和list2env()。当我添加ls() 时,似乎表明... 传递了一个... 对象,其中cc 无法访问到函数体中cc 的范围。请注意,在我添加 all.names=TRUE 之前,ls() 不会显示 ...。然后我添加了 list2env(),条件是... 中有一些东西。但据我所知,这根本没有任何作用。
那么,三个问题:
- list2env 怎么了?为什么这里没有效果?
- 如何生成命名参数(在参数的意义上
按标签分配名称)中的
...通常在 就好像这个名字是正式的一样? - 与 (2) 相同的问题,但针对具有 名称,或者是一个名称,没有通过标签中的标签分配该名称 参数列表。
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
非常感谢!给修复我格式的人。
【问题讨论】:
标签: r scope parameter-passing