J'ai une question concernant le passage de plusieurs arguments à une fonction, lors de l'utilisation de lapply
in R
.
Quand j'utilise lapply avec la syntaxe de 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 les éléments de input
sont passés en x
argument à myfun
.
Mais que faire si j'ai besoin de transmettre d'autres arguments myfunc
? Par exemple, il est défini comme ça:
myfun <- function(x, arg1) {
# doing something here with x and arg1
}
Comment puis-je utiliser cette fonction en passant les deux input
éléments (en x
argument) et un autre argument?
Réponses:
Si vous recherchez la page d'aide, l'un des arguments
lapply
est le mystérieux...
. Lorsque nous regardons la section Arguments de la page d'aide, nous trouvons la ligne suivante:Donc, tout ce que vous avez à faire est d'inclure votre autre argument dans l'
lapply
appel en tant qu'argument, comme ceci:et
lapply
, reconnaissant que cearg1
n'est pas un argument avec lequel il sait quoi faire, le transmettra automatiquementmyfun
. Toutes les autresapply
fonctions peuvent faire la même chose.Un addendum: vous pouvez également l'utiliser
...
lorsque vous écrivez vos propres fonctions. Par exemple, disons que vous écrivez une fonction qui appelleplot
à 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 comme argument dans votre fonction, mais c'est ennuyeux. Au lieu de cela, vous pouvez utiliser...
(comme argument à la fois pour votre fonction et pour l'appel à tracer à l'intérieur), et avoir tout argument que votre fonction ne reconnaît pas être automatiquement transmisplot
.la source
Comme suggéré par Alan, la fonction 'mapply' applique une fonction à plusieurs listes multiples ou arguments vectoriels:
Voir la page de manuel: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html
la source
outer
dans la même veine, qui applique une fonction à chaque paire de valeurs dans deux arguments vectoriels. Page de manuelVous pouvez le faire de la manière suivante:
et vous obtiendrez la réponse:
[[1]] [1] 200
[[2]] [1] 400
[[3]] [1] 600
la source
x
est un vecteur ou d' une liste etmyfun
enlapply(x, myfun)
est appelé pour chaque élémentx
séparément.Option 1
Si vous souhaitez utiliser entier
arg1
dans chaquemyfun
appel (myfun(x[1], arg1)
,myfun(x[2], arg1)
etc.), utilisezlapply(x, myfun, arg1)
(comme indiqué ci-dessus).Option 2
Si vous souhaitez cependant appeler
myfun
chaque élément dearg1
séparément à côté des éléments dex
(myfun(x[1], arg1[1])
,myfun(x[2], arg1[2])
etc.), il n'est pas possible d'utiliserlapply
. À la place, utilisezmapply(myfun, x, arg1)
(comme indiqué ci-dessus) ouapply
:ou
la source