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

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


person Vasily A    schedule 20.01.2013    source источник
comment
Завершение строк ввода консоли R с помощью; это признак того, что вы, вероятно, использовали какой-то язык обработки макросов в прошлом. Аргумент «тройные точки» описан в подразделе 4 раздела «Написание собственных функций» введения в документ R, возможно, в первом руководстве, которое вы должны прочитать.   -  person IRTFM    schedule 20.01.2013


Ответы (4)


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

...: optional arguments to ‘FUN’.

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

lapply(input, myfun, arg1=6)

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

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

person Jonathan Christensen    schedule 20.01.2013
comment
Что, если ваш второй аргумент, например, arg1, является списком, который соответствует входному списку? Когда я пробую lapply (input, myfun, arg1 = input2), где input2 - это список, похоже, что lapply передает весь список сразу, а не элемент за элементом, как с 'input'. - person Alan; 27.08.2015
comment
Я только что нашел ответ в другом сообщении, которое работает: mapply (myfun, df $ input, df $ input2) - person Alan; 27.08.2015

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

mapply(myfun, arg1, arg2)

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

person Andrew    schedule 30.09.2016
comment
И в том же ключе стоит упомянуть outer, который применяет функцию к каждой паре значений в двух векторных аргументах. Страница руководства: stat.ethz.ch/R -manual / R-devel / library / base / html / outer.html - person ms609; 08.07.2019

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

 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

person Gpwner    schedule 17.04.2017

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)

or

 apply(rbind(x,arg1), 2, myfun).
person hanna    schedule 03.11.2019