2011-01-13 25 views
42

Bağımsız değişkenlerin önceden tanımlanmış birkaç değerden (varsayılan değerlerden biri) veya özel bir karakter vektöründen biri olabileceği bir R işlevine sahip olduğumu varsayalım. Bunu sihirli değer isimlerine veya başka bir bayrağa dayanmadan nasıl uygulamalıyım?İşlev varsayılan bağımsız değişkenleri ve adlandırılmış değerler

#allow use of predefined subsets or pass their own list 
bratPack<-function(members='CORE',...){ 
    if (members=='CORE') 
    members<-c('Emilio Estevez','Anthony Michael Hall','Rob Lowe','Andrew McCarthy','Demi Moore','Judd Nelson','Molly Ringwald','Ally Sheedy') 
    else if (members=='ALL') 
    members<-c('Emilio Estevez','Anthony Michael Hall','Rob Lowe','Andrew McCarthy','Demi Moore','Judd Nelson','Molly Ringwald','Ally Sheedy','James Spader','Robert Downey, Jr.','Jon Cryer', 'John Cusack', 'Kevin Bacon', 'Jami Gertz', 'Mary Stuart Masterson', 'Matthew Broderick', 'Sean Penn', 'Kiefer Sutherland') 
    ... 
} 

cevap

6

Ben paketinde yerde bazı sabit dataframe kullanmak:

.mdata <- data.frame(
    CORE= c(TRUE,FALSE,TRUE), 
    OLD = c(TRUE,TRUE,FALSE), 
    ALL = c(TRUE,TRUE,TRUE), 
    row.names=c("John Doe", "Jan Janssen", "Piet Peters") 
) 

bratPack<-function(members='CORE',...){ 
    m.tmp <- try(
     match.arg(members,names(.mdata),several.ok=T), 
     silent=T) 

    if(!is(m.tmp,"try-error")) 
    members <- rownames(.mdata)[.mdata[[members]]] 

    print(members) 
} 

> bratPack('CORE') 
[1] "John Doe" "Piet Peters" 

> bratPack('Jan Janssen') 
[1] "Jan Janssen" 

> bratPack(c("John Doe","Dick Dickers")) 
[1] "John Doe"  "Dick Dickers" 
52

sizin örnek itibaren biz "CORE" ve "ALL" seçim var. Bu iki seçenekse, bunları 'members' argümanı için işlev tanımında belirtiriz. Örn .:

foo <- function(x, members = c("CORE", "ALL")) { 
    ## do something 
} 

bu ilk adlandırılmış seçenek olduğu gibi bu fonksiyon tanımı "CORE" bir varsayılan, argüman 'members' için izin verilen değerler kurar.

İşlev gövdesi içinde kullanılan kod, @Joris önceden belirtildiği gibi match.arg(), ancak yukarıdaki gibi işlevi ayarladığımız için, yalnızca match.arg(members} numaralı telefonu kullanabiliriz. seçeneğimiz kümesine dahil değil dize kaynağı olduğunda

> foo() 
[1] "CORE" 
> foo(members = "CORE") 
[1] "CORE" 
> foo(members = "ALL") 
[1] "ALL" 
> foo(members = "3rdRate") 
Error in match.arg(members) : 'arg' should be one of “CORE”, “ALL” 

Bildirim davranışı: Böyle kullanmak

foo <- function(x, members = c("CORE", "ALL")) { 
    ## evaluate choices 
    members <- match.arg(members) 
    ## do something 
    print(members) 
} 

:

Yani biz foo yazabilir. Sezgisel hata mesajı alıyoruz, çünkü fonksiyon argümanlarındaki seçenekleri kurduk.

+0

Bunu yazdıktan sonra, "CORE" veya "ALL" seçenekleri için bir şey isteyip istemediğinizden emin olabilirsiniz veya isimlerin iki vektörünü bir yere saklamak isteyip istemediğinizden emin değilim. Cevabım, ilkini ele alıyor. Q. –

+0

unvanını okurken düşündüğüm şey, foo'yu ("3rdRate") kabul etmem gerekiyor. Temel olarak, bu tür önceden tanımlanmış alt kümeleri uygulamak için sözleşmenin ne olduğunu merak ediyorum. –

+1

@Gavin 'Üyeler <- 'CORE'' yapmak zorunda değilsiniz:' match.arg() 'içinde' 'some.ok = T' seçeneğini ayarlarsanız. Sadece birinciyle eşleşecek. Veya sadece 'match.arg (" CORE ")' seçenekleri belirtmeden aynısını yapar. Uyarlama, sadece veri çerçevesi sabitinin paket içinde uyarlanmasını gerektirdiğinden, fonksiyondaki tüm seçenekleri belirtmemeyi seçtim. Aksi takdirde yeni bir kategori eklemek istiyorsanız hem veri çerçevesini hem de işlevi uyarlamanız gerekir. Sanırım bir tasarım meselesi. Ayrıca, try yapısını kullanarak OP'nin sorduğu gibi bir vektörün belirtilmesine izin verir. –

İlgili konular