web-dev-qa-db-fra.com

R applique une fonction avec plusieurs paramètres

J'ai une fonction f(var1, var2) dans R. Supposons que nous configurions var2 = 1 et que je veuille maintenant appliquer la fonction f() à la liste L. En gros, je veux une nouvelle liste L * avec les sorties

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

Comment faire cela avec soit apply, mapply ou lapply?

110
Michael

Il suffit de passer var2 comme argument supplémentaire à l’une des fonctions d’application.

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

sapply(mylist,myfxn,var2=var2)

Ceci passe le même var2 à chaque appel de myfxn. Si vous préférez que chaque appel de myfxn reçoive le 1er/2ème/3ème/etc. élément de mylist et var2, alors vous êtes dans le domaine de mapply.

163
Ari B. Friedman

Si votre fonction a deux variables vectorielles et doit se calculer sur chaque valeur (comme mentionné par @Ari B. Friedman), vous pouvez utiliser mapply comme 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
32
Alexander

Pour généraliser davantage l'exemple de @ Alexander, outer est 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
0
ms609