2011-06-27 27 views
12

I bileşimleri, önce kullanılmış, bu yaklaşım R.R listesindeki bir işleve nasıl geçiş yapılır?

bir işlev için bir liste geçmek hakkında bilgi bulma zorluğu ettirmektedirler

plot(list(x=1,y=1)) 

ancak aşağıdaki örnek bana bir hata veriyor:

foo <- function(a, b) c <- a + b 
foo(list(a=1,b=1)) 

Error in foo(list(a = 1, b = 1)) : 
    argument "b" is missing, with no default 

Dahası, ?function çalışmaz ve help('function') bir işleve bir liste geçirerek hakkında bilgi sağlamaz.

netleştirmek için güncelleme, ben tek argüman olarak bir liste nasıl kullanabileceğinizi anlıyorum ama işlevlerin bir özellik birden argümanlar olarak iletilen olabileceğini oldu izlenim çünkü karıştı bir liste. Bu izlenimin yanlış olduğu anlaşılıyor. Daha ziyade, aşağıdaki yorum ve cevaplarda açıklandığı gibi, pek çok işlev özellikle listelerin işlenmesi için yazılmıştır.

+0

Tek 2. Doğru çağrı olacağını beklediğini fonksiyonunuza argüman geçiyoruz: (1), b = liste foo (a = listesi (2)). Eğer fonksiyonunuza tek bir listeyi geçmek istediyseniz, bunu (a) fonksiyonu olarak ilan etmeli ve sonra yaptığınız gibi çağırmalısınız. Sayısal olmayan argümanları böyle bir şekilde ekleyemediğinizden ve fonksiyonlarınızı istediğiniz yerde elde etmek için (yani tahmin etmek) yani [[1]] [[1]]. – diliop

+1

Gözden bakmadım, ama tahmin ediyorum ki 'arsa' listeleri yöneten bir yönteme sahip. Foo ile benzer bir şey yapmak için, jenerik yapmak ve uygun yöntemler yazmak gerekir. –

+0

@Joshua, açıklama için teşekkürler. Bir listenin özel muamele olmadan geçebileceği izlenimi altındaydım. –

cevap

23

kullanın Alternatif İşleviniz iki argüman vardır ama sadece birisi, dolayısıyla hata geçiyoruz

foo <- function(l) l$a + l$b 

foo(list(a=1,b=1)) 
+1

teşekkürler. 'Do.call' işlevi harika! –

5

yapabilirsiniz

foo <- function(a, b) a + b 

do.call(foo, list(a=1,b=1)) 

do.call.

Sen şöyle kodunuzu değiştirebilirsiniz:

foo <- function(a) c <- a[[1]] + a[[2]] 
foo(list(a=1,b=1)) 
İlgili konular