2015-07-21 5 views
10

Ist es möglich, eine Art Liste möglicher Werte für meine switch-Funktion bereitzustellen. Ich würde gerne alles automatisch auf dem neusten Stand halten, wenn jemand einen falschen Parameter liefert.Verwenden einer Liste möglicher Werte in einem Schaltbefehl

Ich benutze die {} für jede Bedingung, weil ich mehr als nur diese Variablendeklaration in meiner Funktion ausführen werde, werde ich mehrere Dinge in diesem Schalter tun.

Ich hätte gerne etwas wie eine Liste, wo ich nur die Namen einfügen kann, um die möglichen Werte zu erhalten. So wäre die ideale Lösung, die ein bisschen wie dies mag, aber ohne Fehlermeldung :-)

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=', ')))) 

Antwort

9

Die switch Funktion ist überflüssig, können Sie einfach eine Liste von Werten Teilmengen direkt:

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

... switch ist ein seltsames Biest in R. Ich habe es nie wirklich nützlich gefunden.

Wenn Sie komplexere Aktionen erfordern durchgeführt werden, sollten Sie eine Liste der Funktionen:

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

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

Ich glaube nicht, kann dies elegant mit switch erreicht werden, aber es kann natürlich in seine eigenen gewickelt werden kleine Funktion. Beachten Sie, dass im Gegensatz zu Hadleys Antwort alle oben genannten Argumente die Namensübereinstimmung von Teilargumenten vermeiden, die eine große Fehlerquelle darstellen und aus dem Gesicht der Erde verbannt werden.

+0

Im Moment definiere ich einfach eine Variable innerhalb einer der Bedingungen, aber später im Skript werde ich mehr Dinge innerhalb des Schalters tun, oder das war zumindest mein Plan :-) Deshalb habe ich diese seltsame Struktur benutzt, aber deine lösung ist auch interessant. – drmariod

+0

@drmariod Ah, gültiger Kommentar. In diesem Fall würde ich vorschlagen, eine Liste von Funktionen und Teilmengen zu verwenden. –

+0

also einfach die Funktion in der Liste aufrufen ?! Hm, klingt wie eine Lösung, nach der ich suche ... Ich habe meine Frage ein wenig aktualisiert. – drmariod

3

statt Schalter, könnten Sie match.arg() und subsetting verwenden:

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

filename <- filenames[[con]] 

Beachten Sie, dass diese teilweise Angleichung der con ermöglicht, die für Ihren Anwendungsfall kann oder auch nicht hilfreich sein.

+0

Ich habe meine Frage ein wenig aktualisiert. das Dateiname-Ding war nur ein Platzhalter, ich werde mehr Befehle innerhalb der Schalter machen. – drmariod

+0

Uh, meine erste Antwort von @hadley ... Ich fühle mich geehrt :-) – drmariod