przekazanie kilku argumentów do FUN of lapply (i inne * mają zastosowanie)

104

Mam pytanie dotyczące przekazywania wielu argumentów do funkcji podczas używania lapplyw 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 inputsą przekazywane jako xargument 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 inputelementów (jako xargument), jak i innego argumentu?

Wasilij A.
źródło
1
Zakończenie linii wejściowych konsoli R znakiem ";" to znak, że prawdopodobnie w przeszłości używałeś jakiegoś języka przetwarzania makr. Argument potrójnych kropek jest opisany w podrozdziale 4 sekcji „Pisanie własnych funkcji” dokumentu „Wprowadzenie do R”, prawdopodobnie pierwszego „Podręcznika”, który powinieneś przeczytać.
IRTFM

Odpowiedzi:

123

Jeśli spojrzysz na stronę pomocy, jednym z argumentów lapplyjest 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 lapplywywołaniu jako argument, na przykład:

lapply(input, myfun, arg1=6)

a lapplyuznając, że arg1nie jest to argument, z którym wie, co zrobić, automatycznie przekaże go myfun. 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łuje plotw 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 do plot.

Jonathan Christensen
źródło
A co, jeśli twój drugi argument, np. „Arg1”, jest listą, która pasuje do listy „input”? Kiedy próbuję lapply (input, myfun, arg1 = input2), gdzie input2 jest listą, wygląda na to, że lapply przekazuje całą listę naraz zamiast elementu po elemencie, jak w przypadku „input”.
Alan
10
Właśnie znalazłem odpowiedź w innym poście, który działa: mapply (myfun, df $ input, df $ input2)
Alan
11

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)

a otrzymasz odpowiedź:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600

Gpwner
źródło
4
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

xjest wektorem lub listę i myfunw lapply(x, myfun)nazywany jest dla każdego elementu xosobno.

opcja 1

Jeśli chcesz używać cały arg1w każdej myfunrozmowy ( 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ć myfundo każdego elementu arg1osobno obok elementów x( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])etc.), 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).
hanna
źródło