使用三点"..."参数的奇怪错误

Ern*_*t A 2 r ellipsis

我需要帮助搞清楚这里发生了什么.

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(...)
}
Run Code Online (Sandbox Code Playgroud)

函数h()打印未评估参数的命名列表,然后尝试评估参数.

看看fz=3和调用时会发生什么z=-3.

> f(1, z=3)
$x
[1] 1

$z
[1] 3

> f(1, z=-3)
$x
[1] 1

$z
..2
Run Code Online (Sandbox Code Playgroud)

这是什么..2?请注意,h(1, z=-3)产生不同的输出:

> h(1, z=-3)
$x
[1] 1

$z
-3
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 5

第二个问题很简单.您有一个函数可以从函数内部创建打印的副作用,作为最后一个被调用的函数.该print函数将其参数作为值返回,因此当函数退出时,控制台的read-eval-print行为会再次显示它.

第一个问题深入研究了内部运作.在省略号的项目得到暂时的名称:..1,..2,..3等.当在前面使用减号2,你实际是在一元运算符来改变其值.你得到与log(2)第二个参数完全相同的结果:

> f(1,log(2))
$x
[1] 1

$y
..2
Run Code Online (Sandbox Code Playgroud)

我认为..2当f的第二个参数是原子时不出现的原因是需要一个不同的评估过程(或没有评估)过程.角色对象也会出现相同的行为.

> f(1,"a")
$x
[1] 1

$y
[1] "a"
Run Code Online (Sandbox Code Playgroud)