передача нескольких аргументов в FUN или lapply (и другие * применяются)

105

У меня вопрос относительно передачи нескольких аргументов функции при использовании 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аргумента) и некоторого другого аргумента?

Василий А
источник
1
Завершение строк ввода консоли R символом ";" это признак того, что вы, вероятно, использовали какой-то язык обработки макросов в прошлом. Аргумент тройной точки описан в подразделе 4 раздела «Написание собственных функций» документа «Введение в R», возможно, первого «Руководства», которое вам следует прочитать.
IRTFM

Ответы:

124

Если вы посмотрите на страницу справки, один из аргументов lapply- загадочный .... Когда мы смотрим на раздел «Аргументы» на странице справки, мы находим следующую строку:

...: optional arguments to ‘FUN’.

Итак, все, что вам нужно сделать, это включить ваш другой аргумент в lapplyвызов как аргумент, например:

lapply(input, myfun, arg1=6)

и lapply, понимая, что arg1это не аргумент, который он знает, что делать, автоматически передаст его myfun. Все остальные applyфункции могут делать то же самое.

Дополнение: вы также можете использовать, ...когда пишете свои собственные функции. Например, скажем, вы пишете функцию, которая вызывает plotв какой-то момент, и вы хотите иметь возможность изменять параметры графика из вызова функции. Вы можете включить каждый параметр в качестве аргумента в свою функцию, но это раздражает. Вместо этого вы можете использовать ...(как аргумент как для вашей функции, так и для вызова построения внутри нее), и любой аргумент, который ваша функция не распознает, будет автоматически передан plot.

Джонатан Кристенсен
источник
Что, если ваш второй аргумент, например, «arg1», является списком, который соответствует списку «input»? Когда я пробую lapply (input, myfun, arg1 = input2), где input2 - это список, похоже, что lapply передает весь список сразу, а не элемент за элементом, как с 'input'.
Алан
10
Я только что нашел ответ в другом посте, который работает: mapply (myfun, df $ input, df $ input2)
Алан
18

Как было предложено Аланом, функция mapply применяет функцию к нескольким множественным спискам или векторным аргументам:

mapply(myfun, arg1, arg2)

См. Справочную страницу: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

Андрей
источник
И outerв том же ключе стоит упомянуть , что функция применяет функцию к каждой паре значений в двух векторных аргументах. Справочная
ms609 08
11

Сделать это можно следующим образом:

 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

Gpwner
источник
4
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).
Ханна
источник