2012-12-20 10 views
6

Mam funkcji, która wygląda na 9 różnych możliwości i wybiera odpowiednie działania mające następującą postać:Jeżeli sprawozdanie z 9 warunków indziej w R

Co robię patrzy w górę wektor i dla każdego wpisu w wektor decydując

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 

itp

chciałbym napisać to w R. Czy ja po prostu umieścić „else” dla każdego przypadku?

Próbowałem switch w następujący sposób:

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)) 
} 

Gdzie losowo od 1 do 10 są funkcje wykorzystujące zmienną „net”

i co komenda switch próbuje zrobić jest sprawdzenie wartości o „stan”, jeżeli jego 6, jak w poprzednim przykładzie, a następnie uruchamia funkcję: random6(net)

+0

'if/if' i' if/else if' są zupełnie odmienne. Zdecyduj, który z nich potrzebujesz jako pierwszy. – irrelephant

+7

Zobacz także '? Switch' –

+0

Edytowałem pytanie może być teraz bardziej przejrzyste. – user1723765

Odpowiedz

4

Zastosowanie switch funkcje jak poniżej:

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" 

dalsze szczegóły znajdują się w ?switch

oparte na przykład:

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) 
} 

to załatwi

Działa to dobrze dla mnie:

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

jest to całkowicie w porządku i dziękuję za pomoc, ale zapoznaj się z moją edycją powyżej, co powinienem wstawić zamiast "1", aby zastosować ją w powyższym walizka? – user1723765

+0

Otrzymuję komunikat o błędzie z informacją: invalid (do_set) z lewej strony do przypisania – user1723765

+0

to jest dokładnie to, co zrobiłem, ale pojawia się komunikat o błędzie wymieniony w moim poprzednim komentarzu – user1723765

5

Innym rozwiązaniem jest spakować wszystkie f unctions chcesz zadzwonić do listy randoms a następnie wybrać pozycję z listy w oparciu o condition:

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

+1 - To jest idea, ale myślę, że powinna to być "FUN <- randoms [[warunek]]", aby uzyskać odpowiednią funkcję, następnie "FUN (net)", aby ją ocenić. (Kod OP jest również mes uspokój się o to.) – flodel

6

Obie odpowiedzi wskazał Ci odpowiednich narzędzi, ale to IMHO jak rzeczy powinny być napisane. OP i oba rozwiązania do tej pory tworzą funkcje wykorzystujące zmienną globalną (net), co nie jest najlepszą praktyką.

Zakładając, że randomX są funkcjami jednego argumentu net, tj.:

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

Następnie trzeba zrobić:

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

lub lepiej:

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

W obu przypadkach wynik jest funkcja, która bierze net jako wkład (tak jak randomX), aby można było to ocenić, wykonując:

FUN(net)

pamiętać, że można zrobić wszystko w jednym krótkim gałką przy użyciu drugiego podejścia również:

FUN.list[[condition]](net) 
Powiązane problemy