17
Mi piacerebbe essere in grado di applicare una funzione a tutte le combinazioni di un insieme di argomenti di input. Ho una soluzione funzionante (sotto), ma sarei sorpreso se non ci fosse un modo migliore/più generico per farlo usando, ad es. plyr, ma finora non hanno trovato nulla. C'è una soluzione migliore?Applicare una funzione su tutte le combinazioni di argomenti
# Apply function FUN to all combinations of arguments and append results to
# data frame of arguments
cmapply <- function(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,
USE.NAMES = TRUE)
{
l <- expand.grid(..., stringsAsFactors=FALSE)
r <- do.call(mapply, c(
list(FUN=FUN, MoreArgs = MoreArgs, SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES),
l
))
if (is.matrix(r)) r <- t(r)
cbind(l, r)
}
esempi:
# calculate sum of combinations of 1:3, 1:3 and 1:2
cmapply(arg1=1:3, arg2=1:3, 1:2, FUN=sum)
# paste input arguments
cmapply(arg1=1:3, arg2=c("a", "b"), c("x", "y", "z"), FUN=paste)
# function returns a vector
cmapply(a=1:3, b=2, FUN=function(a, b) c("x"=b-a, "y"=a+b))
Che cosa si intende per "migliore"? Quello che hai sembra essere eccellente. – Roland
Speravo solo che ci fosse già una funzione esistente da qualche parte là fuori – wannymahoots
Non che io sappia. Puoi passare una funzione a 'combn' o' outer', ma non è proprio quello che vuoi. – Roland