2013-03-09 7 views
8

numaralı listeyle değiştirin. Bazı durumlarda isteğe bağlı sayıda argüman içeren bir işlev vardır. Örneğin, paketin bootstrapPage işlevi parlak. Bir data.frame'im varsa ve bir satır için bir widget oluşturmak istiyorsanız, data.frame satır numarasına göre argüman sayısını iletmenin güzel bir yolunu bulamadım. Şimdiye kadar komut dosyası oluşturmak ve Gerçekte eval(parse(text="..."))Bağımsız değişkenleri R

yöntemini kullanır, (anahtar ve değer) bir list benzer, bu yüzden bir yol olup olmadığını merak ediyorum Ar işlev geçirilen ifade yapısı bir işlev f ve bir liste argv varsa,

Daha özel olarak R de bir liste olarak bağımsız değişken geçmek argv ve adının eşleme göre f için argv nesneleri iletmek için bir yol yoktur f argümanlarının adı ve argv pozisyonu ve f argümanlarındaki pozisyonu? Örneğin

,

izin
f <- function(a, b) a + b 
argv <- list(a=1, b=2) 
Ben argv f(a=argv$a, b=argv$b) eşdeğerdir f geçmesi gerektiğini nasıl

?

Ya da biz varsa:

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

nasıl geçmelidir argvf(a=argv$a, b=argv$b, argv[[3]], argv[[4]], argv[[5]]) eşdeğerdir f için?

Teşekkürler!

cevap

11

do.call ürününü incelemektesiniz. İşte

do.call(f, argv) 

örneklerinden

> 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

Güzel koleksiyon bazı örneklerdir. Bu, "R'ye giriş" de daha iyi tedaviyi hak eden dilin bir özelliğidir. Mükemmel örnekler için –

+2

+1 –