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

时间:2017-07-19 00:48:37

标签: r do.call

我对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_)

1 个答案:

答案 0 :(得分:0)

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

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

而您定义的功能只接受&#34; x&#34;参数。所以第二部分相当于:

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

由于v1和v2未定义,因此会给出相同的错误。

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

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