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?
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
.
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
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
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).
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