考虑一下以下这个接收3个参数的玩具函数:
对于每个参数,我都有一些值(不一定是每个参数都有相同数量的值),我想将
但这并不是我想要的。实际上,根据
因此,我们可以使用
所以,我的问题是有什么聪明的方法可以做到这一点?
当然,我可以事先准备好组合,并安排参数供 -rowwise- 包括所有组合。但我认为这可能是一个相当常见的任务,可能已经有一个函数,在 apply-family 中可以完成这个任务。
toy <- function(x, y, z){
paste(x, y, z)
}
对于每个参数,我都有一些值(不一定是每个参数都有相同数量的值),我想将
toy
函数应用于这些参数的不同组合。因此,我想到可以使用apply函数的多元版本mapply
。mapply(FUN = toy, x = 1:2, y = c("#", "$"), z = c("a", "b"))
[1] "1 # a" "2 $ b"
但这并不是我想要的。实际上,根据
mapply
的帮助文档,“将FUN应用于每个...参数的第一个元素、第二个元素、第三个元素等等”。我想要的是将FUN应用于所有参数的不同组合。因此,我们可以使用
expand.grid()
函数来获取所有参数的不同组合,并使用mapply()
函数将FUN应用于每个组合。[1] "1 # a" "2 $ b"
The result I would like is rather:
[1] "1 # a" "1 # b" "1 $ a" "1 $ b" "2 # a" "2 # b" "2 $ a" "2 $ b"
所以,我的问题是有什么聪明的方法可以做到这一点?
当然,我可以事先准备好组合,并安排参数供 -rowwise- 包括所有组合。但我认为这可能是一个相当常见的任务,可能已经有一个函数,在 apply-family 中可以完成这个任务。
do.call(paste, expand.grid(x = 1:2, y = c("#", "$"), z = c("a", "b")))
。 - David Arenburg