为什么省略号...在 purrr 的 lambda 函数中使用时必须包含在 c() 中

why ellipsis ... have to be wrapped inside c() when used in lambda functions in purrr

这个问题可以称为 的第 3 部分。

我知道 lambda 函数中的参数在 tidyverse 尤其是 purrr 函数中使用时写为 -

在链接的问题中,我了解到如果必须同时传递所有参数,我们可以使用省略号,即 ...

但我的问题是,为什么这样的 ... 仅在包裹在 c() 中时才起作用,而在这样使用时不起作用。在下面的两种语法中,第二种有效而第一种无效?

#1 this doesn't work

pmap_df(iris[1:4], ~...)

Error in .f(Sepal.Length = .l[[1L]][[i]], Sepal.Width = .l[[2L]][[i]],  : 
  '...' used in an incorrect context



#2 this however, works and returns the first argument after converting it to a tibble
pmap_df(iris[1:4], ~ c(...))

#see
identical(pmap_df(iris[1:4], ~c(...)), iris[1:4] %>% as_tibble())
[1] TRUE

谁能解释一下?

offical documentation 关于省略号有这样的说法:

The components of ‘...’ can be accessed in the usual pairlist manner from C code, but is not easily accessed as an object in interpreted code.

所以这可能是您问题的部分答案:省略号是 不容易访问的对象

您可能需要进行一次 safari 之旅才能深入了解事物的 C 代码。

现在是一个不容易访问的对象 ... 当然不符合列表或向量的条件,而这正是 pmap_df 想要的。尽管从技术上讲可能可以。

但是看到~是如何创建单行函数体的,真正的原因可能是它本身没有首先考虑省略号。

考虑:


f <- function( ... ) {
    ~...
}

f(a=1,b=2) ## returns just `~...` , no trace of a and b in the formula's environment either.

现在考虑:~........。效果一样好。

~ 愉快地接受任意数量的点或其他 alfa num 字符,例如 ~.......~aaa......bb...cc...,有效地证明它不关心其他正常的外观方式在省略号处并将它们视为名称的一部分。