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ę tak zdefiniować myfun:
myfun <- function(x) {
# doing something here with x
}
lapply(input, myfun);
a elementy input
są przekazywane jako x
argument do myfun
.
Ale co, jeśli muszę przekazać więcej argumentów myfunc
? Na przykład jest zdefiniowany w ten sposób:
myfun <- function(x, arg1) {
# doing something here with x and arg1
}
Jak mogę użyć tej funkcji z przekazaniem zarówno input
elementów (jako x
argument), jak i innego argumentu?
Odpowiedzi:
Jeśli spojrzysz na stronę pomocy, jednym z argumentów
lapply
jest tajemniczy...
. Kiedy spojrzymy na sekcję Argumenty na stronie pomocy, znajdziemy następujący wiersz:...: optional arguments to ‘FUN’.
Więc wszystko, co musisz zrobić, to uwzględnić swój drugi argument w
lapply
wywołaniu jako argument, na przykład:lapply(input, myfun, arg1=6)
a
lapply
uznając, żearg1
nie jest to argument, z którym wie, co zrobić, automatycznie przekaże gomyfun
. Wszystkie inneapply
funkcje mogą robić to samo.Dodatek: możesz używać również
...
podczas pisania własnych funkcji. Na przykład, powiedzmy, że piszesz funkcję, która wywołujeplot
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 do swojej funkcji, ale to denerwujące. Zamiast tego możesz użyć...
(jako argumentu zarówno dla swojej funkcji, jak i wywołania w niej plotowania) i mieć dowolny argument, którego funkcja nie rozpoznaje, zostanie automatycznie przekazany doplot
.źródło
Zgodnie z sugestią Alana funkcja „mapply” stosuje funkcję do wielu list wielokrotnych lub argumentów wektorowych:
Zobacz stronę podręcznika : https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html
źródło
outer
w tym samym duchu, który stosuje funkcję do każdej pary wartości w dwóch argumentach wektorowych. Strona podręcznikaMoż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)
a otrzymasz odpowiedź:
[[1]] [1] 200
[[2]] [1] 400
[[3]] [1] 600
źródło
myfun <- function(x, arg1) { # doing something here with x and arg1 }
x
jest wektorem lub listę imyfun
wlapply(x, myfun)
nazywany jest dla każdego elementux
osobno.opcja 1
Jeśli chcesz używać cały
arg1
w każdejmyfun
rozmowy (myfun(x[1], arg1)
,myfun(x[2], arg1)
etc.), należy użyćlapply(x, myfun, arg1)
(jak wspomniano wyżej).Opcja 2
Gdybyś jednak jak zadzwonić
myfun
do każdego elementuarg1
osobno obok elementówx
(myfun(x[1], arg1[1])
,myfun(x[2], arg1[2])
etc.), nie jest możliwe użycielapply
. Zamiast tego użyjmapply(myfun, x, arg1)
(jak podano powyżej) lubapply
:apply(cbind(x,arg1), 1, myfun)
lub
apply(rbind(x,arg1), 2, myfun).
źródło