映射所有参数';组合[R]

映射所有参数';组合[R],r,mapply,R,Mapply,考虑这个接收3个参数的玩具函数: toy <- function(x, y, z){ paste(x, y, z) } 但这并不是我想要的。实际上,根据帮助mapply“将乐趣应用于每个…参数的第一个元素、第二个元素、第三个元素,依此类推。”。我想要的是把乐趣运用到所有论点的不同组合上 因此,与其 [1] "1 # a" "2 $ b" 我希望的结果是: [1] "1 # a" "1 # b" "1 $ a" "1 $ b" "2 # a" "2 # b" "2 $ a" "2

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

toy <- function(x, y, z){
    paste(x, y, z)
}
但这并不是我想要的。实际上,根据帮助
mapply
“将乐趣应用于每个…参数的第一个元素、第二个元素、第三个元素,依此类推。”。我想要的是把乐趣运用到所有论点的不同组合上

因此,与其

[1] "1 # a" "2 $ b"
我希望的结果是:

[1] "1 # a" "1 # b" "1 $ a" "1 $ b" "2 # a" "2 # b" "2 $ a" "2 $ b"
那么,我的问题是,做这件事的聪明方法是什么


当然,我可以事先准备好组合,并安排
mapply
的参数,以便它们包括所有的组合。但我只是认为这可能是一项相当常见的任务,而且在apply系列中可能已经有一个函数可以完成这项任务。

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

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

这将适用于任何输入。例如,为了验证,你可以尝试像玩具(x,y,z,y,y,y,z)。

你可以做
do.call(粘贴,展开.grid(x=1:2,y=c(“#“,“$”),z=c(“a”,“b”))
maybethanks
expand.grid
用于准备组合。我只需要分两步来做。首先,
args可以,但是
do.call
是矢量化的,并且比
mapply
效率更高,但是可能它并不总是可以扩展到更一般的情况。
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"