2012-08-30 4 views
0

J'ai une fonction dans R qui prend en paramètre 3, disons foo(x,y,z).R Combiner mapply et sapply

Lorsque j'appelle la fonction, j'ai vraiment une liste d'éléments pour x, et une liste pour y mais seulement un élément pour z. Si Z était une liste, et je voulais appliquer foo à chaque élément, mapply(foo, x, y, z) fonctionne. Cependant, puisque z n'est pas une liste, mapply(foo,x,y,z) ne fonctionne pas.

Plus précisément, si x et y sont des listes de 3 éléments chacun, ce qui suit fonctionne cependant: mapply(foo, x, y, list(z, z, z)).

Y at-il un moyen que je peux peut-être combiner mapply et sapply sans moi d'abord faire z dans une liste de 3 éléments? Je veux juste que z soit réutilisé!

Edit 1: On m'a demandé un exemple:

mylist1 <- list(c(5,4), c(7,9), c(8,3)) 
mylist2<- list(c(2,3), c(6,7), c(10,11)) 
item3 <- matrix(data = 15, nrow = 3, ncol = 3) 
foo <- function(x,y,z){ 
     return(x[1]+y[2]+z[2,2]) 
} 

Les travaux suivants:

> mapply(foo, mylist1, mylist2, list(item3,item3, item3)) 
[1] 23 29 34 

Ce qui suit ne fonctionne pas:

mapply(foo, mylist1, mylist2, item3) 
Error in z[2, 2] : incorrect number of dimensions 
+1

Je ne pense pas que je suis. La documentation de '? Mapply' indique que les arguments sont étendus via le recyclage. Pouvez-vous construire un exemple concret illustrant votre problème? – joran

Répondre

4

Utilisez l'argument MoreArgs à mapply

mapply(foo, x = mylist1, y= mylist2, MoreArgs = list(z = item3)) 
## [1] 23 29 34 
+0

Ceci est fondamentalement identique à (mais plus de typage que) ce que j'ai proposé. – joran

+0

Oui, mais je ne suis pas sûr que ce soit la même chose, est-ce que votre solution évalue 'list (item3)' comme l'argument MoreArgs, ou dans le cadre de '...'? Est-ce que ça importe? Peu importe, je pense que c'est une bonne pratique de nommer les arguments pour la lisibilité. Je suis plus qu'heureux d'ajouter ma réponse comme un edit à la vôtre s'ils évaluent à la même chose – mnel

+0

Oh, je ne me plains pas! Je suis à peu près certain que si vous ne nommez pas 'list (item3)', il sera évalué avec '...', mais je ne sais pas si cela implique un coût de performance en forçant cette vectorisation par recyclage. En effet, je ne suis pas sûr de savoir comment R manipule le morceau MoreArgs en interne. – joran

2

Vous avez juste pour mettre le dernier élément dans une liste, et R le recyclera très bien:

mapply(foo, mylist1, mylist2, list(item3)) 

Notez que la documentation indique expressément que les arguments que vous passez doivent être:

arguments vectoriser sur (vecteurs ou listes de longueur strictement positive, ou tout zéro longueur)

et vous essayiez de passer une matrice.

Questions connexes