przekazywanie kilku argumentów do FUN of lapply (i innych * apply)

Mam pytanie dotyczące przekazywania wielu argumentów do funkcji, podczas używania lapply w R.

Kiedy używam lapply ze składnią lapply(input, myfun); - jest to łatwo zrozumiałe i mogę zdefiniować myfun tak:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

I elementy input są przekazywane jako argument x do myfun.

Ale co jeśli będę musiał przekazać kilka argumentów myfunc? Na przykład, jest on zdefiniowany w następujący sposób:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

Jak mogę używać tej funkcji z przekazaniem oba elementy input (jako argument x) i jakiś inny argument?

 111
Author: user213544, 2013-01-20

4 answers

Jeśli zajrzysz na stronę pomocy, jednym z argumentów {[2] } jest tajemniczy .... Gdy spojrzymy na sekcję argumenty na stronie pomocy, znajdziemy następujący wiersz:

...: optional arguments to ‘FUN’.

Więc wszystko, co musisz zrobić, to dołączyć swój drugi argument w wywołaniu lapply jako argument, jak tak:

lapply(input, myfun, arg1=6)

I lapply, uznając, że arg1 nie jest argumentem, z którym wie, co zrobić, automatycznie przekaże go myfun. Wszystkie pozostałe funkcje apply mogą robić to samo rzecz.

dodatek: możesz też używać ... podczas pisania własnych funkcji. Na przykład, powiedzmy, że piszesz funkcję, która wywołuje plot w pewnym momencie i chcesz mieć możliwość zmiany parametrów wykresu z wywołania funkcji. Możesz dołączyć każdy parametr jako argument w swojej funkcji, ale to jest denerwujące. Zamiast tego możesz użyć ... (jako argumentu zarówno do funkcji, jak i wywołania do wykreślenia wewnątrz niej) i mieć dowolny argument, którego funkcja nie recognition be automatycznie przekazywane do plot.

 128
Author: Jonathan Christensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 11:12:05

Zgodnie z sugestią Alana, funkcja "mapply" stosuje funkcję do wielu list lub argumentów wektorowych:

mapply(myfun, arg1, arg2)

Zobacz stronę man: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

 19
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 15:59:14

Możesz to zrobić w następujący sposób:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

I otrzymasz odpowiedź:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600

 12
Author: Gpwner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-17 01:32:30
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

x jest wektorem lub listą i myfun w lapply(x, myfun) jest wywoływany dla każdego elementu x oddzielnie.

Opcja 1

Jeśli chcesz użyć całego arg1 w każdym myfun wywołanie (myfun(x[1], arg1), myfun(x[2], arg1) itd.), użyj lapply(x, myfun, arg1) (Jak wspomniano powyżej).

Opcja 2

Jeśli jednak chcesz wywołać myfun do każdego elementu arg1 oddzielnie obok elementów x (myfun(x[1], arg1[1]), myfun(x[2], arg1[2]) itd.), nie jest możliwe użycie lapply. Zamiast tego użyj mapply(myfun, x, arg1) (jak podano powyżej) lub apply:

 apply(cbind(x,arg1), 1, myfun)

Lub

 apply(rbind(x,arg1), 2, myfun).
 5
Author: hanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-04 06:07:05