У меня вопрос относительно передачи нескольких аргументов функции при использовании lapply
в R
.
Когда я использую lapply с синтаксисом lapply(input, myfun);
- это легко понять, и я могу определить myfun так:
myfun <- function(x) {
# doing something here with x
}
lapply(input, myfun);
и элементы input
передаются в качестве x
аргумента myfun
.
Но что, если мне нужно передать еще несколько аргументов myfunc
? Например, это определяется так:
myfun <- function(x, arg1) {
# doing something here with x and arg1
}
Как я могу использовать эту функцию с передачей обоих input
элементов (в качестве x
аргумента) и некоторого другого аргумента?
Ответы:
Если вы посмотрите на страницу справки, один из аргументов
lapply
- загадочный...
. Когда мы смотрим на раздел «Аргументы» на странице справки, мы находим следующую строку:...: optional arguments to ‘FUN’.
Итак, все, что вам нужно сделать, это включить ваш другой аргумент в
lapply
вызов как аргумент, например:lapply(input, myfun, arg1=6)
и
lapply
, понимая, чтоarg1
это не аргумент, который он знает, что делать, автоматически передаст егоmyfun
. Все остальныеapply
функции могут делать то же самое.Дополнение: вы также можете использовать,
...
когда пишете свои собственные функции. Например, скажем, вы пишете функцию, которая вызываетplot
в какой-то момент, и вы хотите иметь возможность изменять параметры графика из вызова функции. Вы можете включить каждый параметр в качестве аргумента в свою функцию, но это раздражает. Вместо этого вы можете использовать...
(как аргумент как для вашей функции, так и для вызова построения внутри нее), и любой аргумент, который ваша функция не распознает, будет автоматически переданplot
.источник
Как было предложено Аланом, функция mapply применяет функцию к нескольким множественным спискам или векторным аргументам:
См. Справочную страницу: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html
источник
outer
в том же ключе стоит упомянуть , что функция применяет функцию к каждой паре значений в двух векторных аргументах. СправочнаяСделать это можно следующим образом:
myfxn <- function(var1,var2,var3){ var1*var2*var3 } lapply(1:3,myfxn,var2=2,var3=100)
и вы получите ответ:
[[1]] [1] 200
[[2]] [1] 400
[[3]] [1] 600
источник
myfun <- function(x, arg1) { # doing something here with x and arg1 }
x
вектор или список иmyfun
вlapply(x, myfun)
вызывается для каждого элементаx
отдельно.Опция 1
Если вы хотите использовать целое
arg1
в каждомmyfun
вызове (myfun(x[1], arg1)
иmyfun(x[2], arg1)
т. Д.), Используйтеlapply(x, myfun, arg1)
(как указано выше).Вариант 2
Однако, если вы хотите вызывать
myfun
каждый элементarg1
отдельно вместе с элементамиx
(myfun(x[1], arg1[1])
иmyfun(x[2], arg1[2])
т. Д.), Это невозможно использоватьlapply
. Вместо этого используйтеmapply(myfun, x, arg1)
(как указано выше) илиapply
:apply(cbind(x,arg1), 1, myfun)
или
apply(rbind(x,arg1), 2, myfun).
источник