所有论点的反对意见'组合[R]

时间:2016-03-09 11:12:04

标签: r mapply

考虑这个玩具函数,它接收3个参数:

toy <- function(x, y, z){
    paste(x, y, z)
}

对于每个参数,我有许多值(每个参数的数字不一定相同),我想将toy函数应用于这些参数的不同组合。

所以我想,好吧,让我们使用应用函数mapply的多变量版本。

mapply(FUN = toy, x = 1:2, y = c("#", "$"), z = c("a", "b"))

[1] "1 # a" "2 $ b"

但这不是我想要的。实际上,根据帮助mapply&#34;将FUN应用于每个...参数的第一个元素,第二个元素,第三个元素等等。&#34;。我想要的是将FUN应用于所有参数的所有不同组合。

所以,而不是

[1] "1 # a" "2 $ b"

我想要的结果是:

[1] "1 # a" "1 # b" "1 $ a" "1 $ b" "2 # a" "2 # b" "2 $ a" "2 $ b"

所以,我的问题是这样做的聪明方法是什么?

当然,我可以预先准备好组合并安排mapply的参数,以便它们包括-rowwise-所有组合。但我只是认为这可能是一个相当普遍的任务,并且在apply-family中可能已经有一个函数可以做到这一点。

1 个答案:

答案 0 :(得分:6)

您可以将do.callexpand.grid合并,以使用无限量的输入,如下所示

toy <- function(...) do.call(paste, expand.grid(...))

然后,你可以做

x = 1:2 ; y = c("#", "$") ; z = c("a", "b")
toy(x, y, z)
# [1] "1 # a" "2 # a" "1 $ a" "2 $ a" "1 # b" "2 # b" "1 $ b" "2 $ b"

这适用于任何输入。您可以尝试toy(x, y, z, y, y, y, z)之类的内容,例如为了验证。