R appliquer la fonction avec plusieurs paramètres


128

J'ai une fonction f(var1, var2)dans R. Supposons que nous ayons défini var2 = 1et maintenant je veux appliquer la fonction f()à la listeL . Fondamentalement, je veux obtenir une nouvelle liste L * avec les sorties

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

Comment puis-je faire cela avec apply, mapplyou lapply?


Réponses:


190

Passez simplement var2 comme argument supplémentaire à l'une des fonctions apply.

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

Cela passe la même chose var2à chaque appel de myfxn. Si à la place vous voulez que chaque appel de myfxnpour obtenir le 1er / 2ème / 3ème / etc. élément des deux mylistet var2, alors vous êtes dans mapplyle domaine de.


5
mais notez que myfxnpeut être vectorisé, auquel cas il faut utilisermyfxn(unlist(mylist), var2=var2)
baptiste le

L'exemple original n'était pas clair, mais semblait être non vectorisé. Point bien pris cependant.
Ari

Est-ce un moyen de faire fonctionner cette fonction "à la volée"? Quelque chose comme ceci: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)mais j'obtiens une erreur indiquant que l'argument 2 correspond à plusieurs arguments formels
emudrak

1
@emudrak Je pense que le problème, c'est que vous nommez l'argument que vous passez à la varplace var2. R ne peut pas deviner ce que tu veux dire.
Ari B.Friedman

49

Si votre fonction a deux variables vectorielles et doit se calculer elle-même sur chacune de leurs valeurs (comme mentionné par @Ari B.Friedman), vous pouvez utiliser mapplycomme suit:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
mapply(mult_one,vars1,vars2)

ce qui vous donne:

> mapply(mult_one,vars1,vars2)
[1] 10 40 90

3
Un vote favorable pour généraliser, même avec un exemple simple et clair.
JASC

mapplyrecyclera également s'il vars1a un seul élément. Par exemple, quand vars1 <- 3, mapply(mult_one, vars1, vars2)retourne 30 60 90. Ceci est utile lorsque vous souhaitez utiliser lapplysur le deuxième argument d'une fonction.
Paul Rougieux

3

Pour généraliser davantage l'exemple de @ Alexander, outerest pertinent dans les cas où une fonction doit se calculer sur chaque paire de valeurs vectorielles:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
outer(vars1,vars2,mult_one)

donne:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.