2013-03-09 5 views
8

Czasami jest funkcja, która ma dowolną liczbę argumentów. Na przykład funkcja bootstrapPage pakietu jest błyszcząca. Jeśli mam data.frame i chcę utworzyć jeden widget dla jednego wiersza, to nie znalazłem sposobu na przekazanie liczby argumentów zgodnie z numerem wiersza data.frame. Do tej pory generuję skrypt i używam podstępu, aby struktura argumentów przekazanych do funkcji R (klucz i wartość) była podobna do list, więc zastanawiam się, czy istnieje sposób przekazać argument w postaci listy w R.Zamień argument na listę w R

Dokładniej, jeśli mam funkcji f oraz listę argv, czy istnieje sposób, aby przejść do obiektów w argvf według dopasowania nazwy argv a nazwa argumentów f, a pozycja w argv i pozycja w argumentach f?

Na przykład, powiedzmy

f <- function(a, b) a + b 
argv <- list(a=1, b=2) 

Jak należy przekazać do fargv co jest równoważne f(a=argv$a, b=argv$b)?

Albo jeśli mamy:

f <- function(a, b, ...) { # some codes } 
argv <- list(a = 1, b = 2, 3, 4, 5) 

Jak należy przekazać do fargv co jest równoważne f(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]])?

Dzięki!

Odpowiedz

11

Szukasz do.call.

do.call(f, argv) 

Oto kilka przykładów

> args <- list(n = 10, mean = 3, sd = .5) 
> do.call(rnorm, args) 
[1] 3.589416 3.393031 2.928506 2.503925 3.316584 2.581787 2.686507 3.178877 
[9] 3.083885 2.821506 
> do.call(rnorm, list(10, 3, .5)) 
[1] 3.964526 2.838760 2.436684 3.068581 1.842332 3.739046 4.050525 3.097042 
[9] 3.665041 3.535947 
> f <- function(a, b) a + b 
> argv <- list(a=1, b=2) 
> do.call(f, argv) 
[1] 3 
> f <- function(a, b, ...){print(a);print(b);print(sum(...))} 
> argv <- list(a=1,b=2, 3, 4, 5) 
> do.call(f, argv) 
[1] 1 
[1] 2 
[1] 12 
+0

Nicea zbiór przykładów. Jest to cecha języka, który naprawdę zasługuje na lepsze traktowanie w "wprowadzeniu do R". –

+2

+1 za świetne przykłady –