2015-07-21 11 views
10

olası değerlerin bir listesini kullanma switch işlevim için olası değerler listesi sağlanabilir mi? Birisi yanlış parametre sağlıyorsa, her şeyi otomatik olarak güncellemeyi çok isterim.Bir anahtar komutunda

Her koşul için {}'u kullanıyorum, çünkü daha sonra bu değişken bildirimi yalnızca işlevimde yürüteceğim, bu anahtar içinde birkaç şey yapacağım.

switch(con, 
     val1={ 
     filename <- 'SILAC-DML_with_PDF.R' 
     }, 
     val2={ 
     filename <- 'SILAC-DML_with_PDF.R' 
     }, 
     stop(sprintf('"%s" is an unknown condition type, please use one of "%s".\n', 
        con, paste(c('val1','val2'), collapse=', ')))) 

ben sadece olası değerleri almak için isimleri yapıştırabilirsiniz bir liste gibi bir şey yapmak isterdim. Yani ideal çözüm böyle biraz istiyorum fakat

my_list <- list(val1=filename <- 'a.R', 
       val2=filename <- 'b.R') 
switch(con, 
     my_list, 
     stop(sprintf('"%s" is an unknown condition type, please use one of "%s".\n', 
        con, names(my_list), collapse=', ')))) 

cevap

9

switch fonksiyonu gereksiz :-) bir hata iletisi, sadece doğrudan değerlerinin bir listesini alt küme edebilirsiniz:

alternatives = list(val1 = 'SILAC-DML_with_PDF.R', 
        val2 = 'SILAC-DML_with_PDF.R') 
result = alternatives[[con]] 
if (is.null(result)) 
    stop(…) 

switch, R.'de garip bir yaratıktır. Asla işe yaramazdım. Bu akıllıca switch ile elde edilebilir sanmıyorum

alternatives = list(
    val1 = function() { message('foo') }, 
    val2 = function() { message('bar') } 
) 

if (! con %in% names(alternatives)) 
    stop(…) 
result = alternatives[[con]]() 

ama tabii kendi içine sarılmış olabilir: Eğer yapılacak daha karmaşık işlemler gerektiriyorsa

, fonksiyonların bir listesini kullanmayı düşünün küçük işlev. Hadley’in cevabından farklı olarak, yukarıdakilerin tümü, büyük bir hata kaynağı olan ve Dünya’nın yüzüne sürgün edilen kısmi argüman adı eşleşmesini engeller. Bu veya kullanım durumu için yararlı olabilir veya olmayabilir con kısmi eşleştirme, izin verdiğini

filenames <- c(
    val1 = "a.R", 
    val2 = "b.R" 
) 
con <- match.arg(con, names(filenames)) 

filename <- filenames[[con]] 

Not:

+0

Şu anda koşullardan birindeki bir değişkeni tanımlamaktayım, ancak daha sonra komut dosyasında daha fazla şey yapacağım, ya da en azından planım :-) Bu yüzden bu garip yapıyı kullandım. ama çözümün de ilginç. – drmariod

+0

@drmariod Ah, geçerli yorum. Bu durumda, bir işlevler listesi ve alt bölüm oluşturmayı öneriyorum. –

+0

bu yüzden listedeki işlevi çağırsın mı ?! Hm, aradığım bir çözüm gibi geliyor ... Soruyu biraz güncelledim. – drmariod

3

yerine anahtarının, sen match.arg() ve subsetting kullanabilirsiniz.

+0

Soruyu biraz güncelledim. dosya adı sadece bir yer tutucuydu, anahtarlar içinde daha fazla komut yapacağım. – drmariod

+0

Uh, @hadley'nin ilk cevabı ... Kendimi onur duydum :-) – drmariod