143 votes

passer plusieurs arguments à FUN de lapply (et autres *apply)

J'ai une question concernant le passage d'arguments multiples à une fonction, lors de l'utilisation de la fonction lapply sur R .

Lorsque j'utilise lapply avec la syntaxe suivante lapply(input, myfun); - c'est facilement compréhensible, et je peux définir myfun comme ça :

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

et des éléments de input sont passés en tant que x argument pour myfun .

Mais que se passe-t-il si j'ai besoin de passer des arguments supplémentaires à myfunc ? Par exemple, il est défini comme suit :

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

Comment puis-je utiliser cette fonction en passant les deux input éléments (comme x argument) et un autre argument ?

160voto

Jonathan Christensen Points 1385

Si vous consultez la page d'aide, l'un des arguments de l'option lapply est le mystérieux ... . Lorsque nous regardons la section Arguments de la page d'aide, nous trouvons la ligne suivante :

...: optional arguments to ‘FUN’.

Donc tout ce que vous avez à faire est d'inclure votre autre argument dans le lapply comme argument, comme ceci :

lapply(input, myfun, arg1=6)

y lapply en reconnaissant que arg1 n'est pas un argument dont il sait quoi faire, il le transmettra automatiquement à myfun . Tous les autres apply peuvent faire la même chose.

Un addendum : Vous pouvez utiliser ... lorsque vous écrivez vos propres fonctions, également. Par exemple, disons que vous écrivez une fonction qui appelle plot à un moment donné, et vous voulez pouvoir modifier les paramètres du tracé à partir de votre appel de fonction. Vous pourriez inclure chaque paramètre comme argument dans votre fonction, mais c'est ennuyeux. Au lieu de cela, vous pouvez utiliser ... (en tant qu'argument de votre fonction et de l'appel à plot à l'intérieur de celle-ci), et faites en sorte que tout argument que votre fonction ne reconnaît pas soit automatiquement transmis à plot .

25voto

Andrew Points 331

Comme l'a suggéré Alan, la fonction "mapply" applique une fonction à plusieurs listes ou arguments vectoriels multiples :

mapply(myfun, arg1, arg2)

Voir la page de manuel : https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

15voto

Gpwner Points 164

Vous pouvez le faire de la manière suivante :

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

et vous obtiendrez la réponse :

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600

7voto

hannafrc Points 348
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

x est un vecteur ou une liste et myfun sur lapply(x, myfun) est appelé pour chaque élément de x séparément.

Option 1

Si vous souhaitez utiliser des arg1 dans chaque myfun appel ( myfun(x[1], arg1) , myfun(x[2], arg1) etc.), utilisez lapply(x, myfun, arg1) (comme indiqué ci-dessus).

Option 2

Si vous souhaitez toutefois appeler myfun à chaque élément de arg1 séparément à côté d'éléments de x ( myfun(x[1], arg1[1]) , myfun(x[2], arg1[2]) etc.), il n'est pas possible d'utiliser la fonction lapply . Au lieu de cela, utilisez mapply(myfun, x, arg1) (comme indiqué ci-dessus) ou apply :

 apply(cbind(x,arg1), 1, myfun)

ou

 apply(rbind(x,arg1), 2, myfun).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X