web-dev-qa-db-fra.com

passer plusieurs arguments à FUN of lapply (et d'autres * s'appliquent)

J'ai une question concernant la transmission de plusieurs arguments à une fonction, lors de l'utilisation de lapply dans R.

Lorsque j'utilise lapply avec la syntaxe de lapply(input, myfun);, cela est facilement compréhensible et je peux définir myfun comme ceci:

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

lapply(input, myfun);

et les éléments de input sont passés comme argument x à myfun.

Mais que se passe-t-il si je dois transmettre quelques arguments supplémentaires à myfunc? Par exemple, il est défini comme ça:

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

Comment utiliser cette fonction en passant à la fois les éléments input (en tant qu'argument x et un autre argument)?

78
Vasily A

Si vous consultez la page d'aide, l'un des arguments de lapply est le mystérieux .... Lorsque nous examinons 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 l'appel lapply en tant qu'argument, comme suit:

lapply(input, myfun, arg1=6)

et lapply, reconnaissant que arg1 _ n'est pas un argument avec lequel il sait quoi faire, le passera automatiquement à myfun. Toutes les autres fonctions apply peuvent faire la même chose.

n addenda: Vous pouvez utiliser ... lorsque vous écrivez vos propres fonctions également. Par exemple, supposons que vous écriviez une fonction qui appelle plot à un moment donné et que vous souhaitez pouvoir modifier les paramètres de tracé à partir de votre appel de fonction. Vous pouvez inclure chaque paramètre en tant qu'argument dans votre fonction, mais c'est embêtant. Au lieu de cela, vous pouvez utiliser ... (comme argument à la fois de votre fonction et de l'appel à tracer en son sein) et que tout argument que votre fonction ne reconnaît pas soit automatiquement transmis à plot.

97

Comme suggéré par Alan, la fonction 'mapply' applique une fonction à plusieurs listes multiples ou arguments de vecteur:

mapply(myfun, arg1, arg2)

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

16
Andrew

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

7
Gpwner