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


99

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

Відповіді:


122

Якщо ви шукаєте довідкову сторінку, один із аргументів lapply- це таємничий .... Переглядаючи розділ Аргументи на сторінці довідки, ми знаходимо такий рядок:

...: optional arguments to ‘FUN’.

Отже, все, що вам потрібно зробити, - це включити інший аргумент у lapplyвиклик як аргумент, приблизно так:

lapply(input, myfun, arg1=6)

і lapply, визнавши, що arg1це не аргумент, з яким він знає, що робити, автоматично передасть його myfun. Усі інші applyфункції можуть робити те саме.

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


Що робити, якщо ваш другий аргумент, наприклад, "arg1" - це список, який відповідає списку "введення"? Коли я намагаюся 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в тому ж ключі, що застосовує функцію до кожної пари значень у двох векторних аргументах. Сторінка користувача: stat.ethz.ch/R-manual/R-devel/library/base/html/outer.html
ms609

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


3
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).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.