使用三点的奇怪错误" ..."争论

时间:2014-07-15 13:54:49

标签: 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(...)
}

函数h()打印一个未评估参数的命名列表,然后尝试 评估论点。

查看使用fz=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

1 个答案:

答案 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"