简体   繁体   中英

If statement with 9 else conditions in R

I have a function which looks at 9 different possibilities and chooses an action accordingly having the following form:

What I'm doing is looking up a vector and for each entry in the vector deciding

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

etc.

I would like to write this in R. Do I just put "else" for every single case?

I have tried switch in the following way:

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

Where random 1 to 10 are functions using the variable 'net'

and what the switch command is trying to do is checking the value of 'condition' and if its 6 as in the above example then it runs the function: random6(net)

Both answers pointed you to the right tools, but this is IMHO how things ought to be written. The OP and both solutions so far are creating functions that use a global variable ( net ) which is not best practice.

Assuming randomX are functions of one argument net , ie:

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

Then you need to do:

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

or better:

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

In both cases, the output is a function that takes net as an input (just like randomX ) so you can evaluate it by doing:

FUN(net)

Also note that you can do everything in one short scoop using the second approach:

FUN.list[[condition]](net)

Another solution is to pack all the functions you want to call into a list randoms and then select a list item based on condition :

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

Use switch function as 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"

further details are in ?switch

based on your example:

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

this will do the trick

This works well for 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM