我需要帮助弄清楚这里发生了什么。
g <- function(x, y=NULL, z=NULL) invisible(NULL)
h <- function(...) {
args <- as.list(match.call(g))[-1]
print(args)
## lapply(args, eval)
}
f <- function(...) {
h(...)
}
函数h()
打印一个未评估参数的命名列表,然后尝试
评估论点。
查看使用f
和z=3
调用z=-3
时会发生什么。
> f(1, z=3)
$x
[1] 1
$z
[1] 3
> f(1, z=-3)
$x
[1] 1
$z
..2
这是..2
是什么?请注意h(1, z=-3)
会产生不同的输出:
> h(1, z=-3)
$x
[1] 1
$z
-3
答案 0 :(得分:5)
第二个问题很简单。您有一个函数可以从函数内部创建打印的副作用,作为最后一个被调用的函数。 print
函数将其参数作为值返回,因此当函数退出时,控制台的read-eval-print行为会再次显示它。
第一个问题深入研究内部运作。省略号中的项目获得临时名称:..1
,..2
,..3
等。当使用2
前面的减号时,您实际上应用了一元运算符改变它的价值。使用log(2)
作为第二个参数得到完全相同的结果:
> f(1,log(2))
$x
[1] 1
$y
..2
我认为当f的第二个参数是原子时..2
没有出现的原因是需要一个不同的评估过程(或没有评估)过程。角色对象也会出现相同的行为。
> f(1,"a")
$x
[1] 1
$y
[1] "a"