2012-12-20 11 views
6

Ho una funzione che prende in esame 9 diverse possibilità e sceglie un'azione di conseguenza avente la seguente forma:Se dichiarazione con 9 condizioni resto in R

Quello che sto facendo è cercare un vettore e per ogni voce il vettore di decidere

IF the value in the vector is 1 THEN start function B 
IF the value in the vector is 2 THEN start function C 
IF the value in the vector is 3 THEN start function D 
IF the value in the vector is 4 THEN start function E 

ecc

vorrei scrivere questo in R. Non ho appena messo "altro" per ogni singolo caso?

Ho provato switch nel seguente modo:

condition<-6 
FUN<-function(condition){ 
    switch(condition, 
    1 = random1(net) 
    2 = random2(net) 
    3 = random3(net) 
    4 = random4(net) 
    5 = random5(net) 
    6 = random6(net) 
    7 = random7(net) 
    8 = random8(net) 
    9 = random9(net) 
    10= random10(net)) 
} 

Dove casuale 1 a 10 sono funzioni utilizzando la variabile 'netto'

e ciò che il comando switch sta cercando di fare è controllare il valore di 'stato' e se 6 come nell'esempio precedente, allora viene eseguito la funzione: random6(net)

+0

'se/if' e' if/else if' sono completamente differenti. Decidi quale ti serve per primo. – irrelephant

+7

Anche guardate a '? Switch' –

+0

ho modificato la domanda forse è più chiaro ora – user1723765

risposta

4

Uso switch funzione come in:

foo <- function(condition){ 
    switch(condition, 
     '1' = print('B'), 
     '2' = print('C'), 
     '3' = print('D'), 
     '4' = print('E')) 
} 

> foo(1) 
[1] "B" 
> foo(2) 
[1] "C" 
> foo(3) 
[1] "D" 
> foo(4) 
[1] "E" 

maggiori dettagli sono in ?switch

, sulla base di esempio:

condition<-6 
FUN<-function(condition){ 
    switch(condition, 
    '1' = random1(net), # Maybe you're missing some commas here 
    '2' = random2(net), # and here 
    '3' = random3(net), # and here 
    '4' = random4(net) 
    ....) # all the way to '10' = random10(net) 
} 

questo farà il trucco

Questo funziona bene per me:

Foo <- function(condition){ 
    x <- 1:20 
    switch(condition, 
     '1' = mean(x), 
     '2' = var(x), 
     '3' = sd(x)) 
} 

> Foo(1) 
[1] 10.5 
> Foo(2) 
[1] 35 
> Foo(3) 
[1] 5.91608 
+0

questo è perfettamente soddisfacente e grazie per il vostro aiuto, ma per favore vedi la mia modifica sopra, cosa dovrei mettere invece di '1' per renderlo applicabile in quanto sopra Astuccio? – user1723765

+0

Viene visualizzato un messaggio di errore che dice: non valido (do_set) lato sinistro all'assegnazione – user1723765

+0

questo è esattamente ciò che ho fatto ma ottengo il messaggio di errore menzionato nel mio precedente commento – user1723765

5

altro la soluzione è di imballare tutto il f unzioni che si desidera chiamare in una lista randoms e quindi selezionare una voce di elenco basato su condition:

randoms <- list(random1, random2, random3, random4, random5, random6, random7, random8, random9, random10) 
FUN <- function(condition) { 
    randoms[[condition]](net) 
} 
+0

+1 - Questa è l'idea, ma penso che dovrebbe essere solo 'FUN <- randoms [[condition]]' per ottenere la funzione corretta, quindi 'FUN (net)' per valutarlo (il codice dell'OP è anche mes sedersi con questo riguardo.) – flodel

6

Entrambe le risposte che indicavano gli strumenti giusti, ma questo è IMHO come le cose dovrebbero essere scritti. L'OP e entrambe le soluzioni finora stanno creando funzioni che utilizzano una variabile globale (net) che non è la migliore pratica.

Supponendo che randomX siano funzioni di un argomento net, ad es.:

random1 <- function(net){ [...] } 
random2 <- function(net){ [...] } 
[etc.] 

allora avete bisogno di fare:

FUN <- switch(condition, 
       '1' = random1, 
       '2' = random2, 
       [etc.]) 

o meglio:

FUN.list <- list(random1, random2, [etc.]) 
FUN <- FUN.list[[condition]] 

In entrambi i casi, l'uscita è una funzione che prende net come input (proprio come randomX) in modo da poterlo valutare eseguendo:

FUN(net)

Si noti inoltre che si può fare tutto in un breve paletta con il secondo approccio:

FUN.list[[condition]](net) 
Problemi correlati