mapply 用于所有参数的组合 [R]
mapply for all arguments' combinations [R]
考虑这个接收 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
"applies FUN to the first elements of each ... argument, the second elements, the third elements, and so on."。我想要的是将 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 中可能已经有一个函数可以做到这一点。
您可以将 do.call
与 expand.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)
之类的东西,例如为了验证。
考虑这个接收 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
"applies FUN to the first elements of each ... argument, the second elements, the third elements, and so on."。我想要的是将 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 中可能已经有一个函数可以做到这一点。
您可以将 do.call
与 expand.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)
之类的东西,例如为了验证。