理解 do.call() 对数据框行 'paste' 与 'function(x) paste(x)' 的处理

Understanding do.call() treatment of 'paste' versus 'function(x) paste(x)' on data frame rows

我对 do.call 的工作原理感到困惑。

dat <- data.frame(v1 = c("a", "a", "b", "b"),
                  v2 = c("a", "b", "a", "b"), 
                  stringsAsFactors = FALSE)

为什么这似乎一次通过一行

do.call(paste, dat)
[1] "a a" "a b" "b a" "b b"

但这不是

do.call(function(x) paste(x), dat)
Error in (function (x)  : 
  unused arguments (v1 = c("a", "a", "b", "b"), v2 = c("a", "b", "a", "b"))

我要使用的函数是

paste_ <- function(x) paste(unique(sort(x)), collapse = "_")

我确实意识到我可以只使用 apply 来获得我想要的东西,但我试图了解 do.call 在做什么。

apply(vars_comb, 1, paste_)

do.call的输入是一个列表,数据帧是列表。所以 do.call(paste, dat) 等同于:

paste(v1=dat$v1, v2=dat$v2)

而您定义的函数只接受一个 "x" 参数。所以第二部分相当于:

my_paste <- function(x) paste(x)
my_paste(v2=dat$v1, v1=dat$v2)

这会给您同样的错误,因为 v1 和 v2 未定义。

但是,您可以看到以下内容确实有效:

do.call(function(...) paste(...), dat)