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