J'essaye de boucler sur une fonction qui a trois arguments, mais ni lapply ni mapply ne fournissent la bonne solution. Le but ici est d'obtenir tous les résultats possibles en fonction de toutes les combinaisons possibles des trois arguments ( num , resp , cdr ). Si vous voyez la fonction ci-dessous, le but ici est de calculer n pour les trois niveaux de num (en maintenant les constantes resp et cdr ), pour les trois niveaux de resp (en maintenant num et cdr constantes), et pour les trois niveaux de cdr (en maintenant resp et num constantes). Mais comme vous pouvez le voir à partir des résultats, ni lapply ni mapply ne fournissent les bonnes réponses ici.
J'ai essayé de le faire avec des boucles for imbriquées sans succès non plus (même si je ne suis pas très doué pour utiliser des boucles, je suis donc ouvert à une solution basée sur les boucles si cela me permet bonne réponse).
Exemple reproductible au minimum:
set.seed(124)
num <- c(10, 20, 30)
resp <- sample(100:200, 3)
cdr <- 3:5
my_fun <- function(num, resp, cdr){
n <- ((num * resp) / cdr)
}
sapply(num, my_fun, resp, cdr)
[,1] [,2] [,3]
[1,] 360 720 1080
[2,] 350 700 1050
[3,] 302 604 906
mapply(my_fun, num, resp, cdr)
[1] 360 700 906
3 Réponses :
Vous pouvez essayer:
df <- expand.grid(data.frame(num, resp, cdr)) with(df, (num * resp) / cdr) num resp cdr n 1 10 151 3 503.3333 2 20 151 3 1006.6667 3 30 151 3 1510.0000 4 10 176 3 586.6667 5 20 176 3 1173.3333 ...
Cela semble également fonctionner do.call (my_fun, expand.grid (data.frame (num, resp, cdr))) +1
# gen data
set.seed(124)
num <- c(10, 20, 30)
resp <- sample(100:200, 3)
cdr <- 3:5
# function (written with one input vector)
my_fun <- function(x){
x[1] * x[2] / x[3]
}
# used expand.grid() and apply() to
# eval function on all combos of num, resp, cdr
opts <- expand.grid(num, resp, cdr)
res <- apply(opts, 1, my_fun)
cbind(opts, res)
apply ne semble pas être une bonne option car la fonction de OP est vectorisée dans ses arguments.
Puis juste: opts <- expand.grid (num, resp, cdr); my_fun (opts [1], opts [2], opts [3]) avec la définition de l'OP de my_fun .
Oui! Consultez do.call - très utile (et efficace) dans de tels cas.
Oui - franchement, malgré mon message, j'aime mieux la solution de @markus avec do.call ()
Une solution basée sur purrr / dplyr serait:
set.seed(124)
num <- c(10, 20, 30)
resp <- sample(100:200, 3)
cdr <- 3:5
my_fun <- function(num, resp, cdr){
((num * resp) / cdr)
}
args <- list(num = num, resp = resp, cdr = cdr)
args %>%
purrr::cross_df() %>%
dplyr::mutate(res = my_fun(num, resp, cdr))
Peut-être
expand.grid (num, resp, cdr)?@ H1 a exécuté
expand.grid (num, resp, cdr)mais pour autant que je sache, il n'applique pas la fonction pour obtenir un calcul denpour chacun des 27 combinaisons?@rowbust Je ne suis pas sûr de ce que votre résultat attendu est censé être (par exemple un
tableau3D, undata.frameaplati, ...?). Pouvez-vous modifier votre message pour l'inclure?@ H1 signifiait simplement que
expand.grid ()vous donnerait les 27 combinaisons, sur lesquelles vous pourriez ensuite utilisermapply(ou quelque chose d'équivalent) correctement.@rowbust BTW Assurez-vous que votre fonction renvoie quelque chose.