Как использовать оператор switch в функции R?


Я хотел бы использовать для моей функции в R заявлением switch() для запуска различных вычислений в соответствии со значением аргумента функции.

например, в MATLAB вы можете сделать это, написав

switch(AA)        
case '1'   
...   
case '2'   
...   
case '3'  
...  
end

Я нашел этот пост - использование оператора switch () - это объясняет, как использовать switch, но не очень полезно для меня, поскольку я хочу выполнять более сложные вычисления (матричные операции), а не простой mean.

3 65

3 ответа:

Ну switch вероятно, на самом деле не должно было так работать, но вы можете:

AA = 'foo'
switch(AA, 
foo={
  # case 'foo' here...
  print('foo')
},
bar={
  # case 'bar' here...
  print('bar')    
},
{
   print('default')
}
)

...каждый случай-это выражение-обычно просто простая вещь, но здесь я использую фигурный блок, чтобы вы могли набить любой код, который вы хотите там...

Я надеюсь, что этот пример помогает. Вы можете использовать фигурные скобки, чтобы убедиться, что у вас есть все, что заключено в switcher changer guy (извините, не знаю технического термина, но термин, который предшествует знаку=, который изменяет то, что происходит). Я думаю о switch как о более контролируемой группе if () {} else {} заявления.

каждый раз, когда функция переключателя одинакова, но команда, которую мы предоставляем, изменяется.

do.this <- "T1"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
#########################################################
do.this <- "T2"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
########################################################
do.this <- "T3"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)

вот он внутри функции:

FUN <- function(df, do.this){
    switch(do.this,
        T1={X <- t(df)
            P <- colSums(df)%*%X
        },
        T2={X <- colMeans(df)
            P <- outer(X, X)
        },
        stop("Enter something that switches me!")
    )
    return(P)
}

FUN(mtcars, "T1")
FUN(mtcars, "T2")
FUN(mtcars, "T3")

эти различные способы переключения ...

# by index
switch(1, "one", "two")
## [1] "one"


# by index with complex expressions
switch(2, {"one"}, {"two"})
## [1] "two"


# by index with complex named expression
switch(1, foo={"one"}, bar={"two"})
## [1] "one"


# by name with complex named expression
switch("bar", foo={"one"}, bar={"two"})
## [1] "two"