我需要帮助弄清楚这里发生了什么。
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()
打印未计算参数的命名列表,然后尝试
评估论点。
看看使用 z=3
和 z=-3
调用 f
时会发生什么。
> 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
最佳答案
第二个问题很简单。您有一个函数,它会产生从函数内部打印为最后调用的函数的副作用。 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"
关于r - 使用三点 "..."参数的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24760137/