2012-05-01 3 views
57

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

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

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

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

ответ

75

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

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

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

+4

есть способ сделать это без сравнения со строками? что кажется весьма неэффективным. – Julius

30

Надеюсь, этот пример поможет. Вы можете использовать фигурные фигурные скобки, чтобы убедиться, что у вас есть все, заключенное в переключателе переключателя переключателя (извините, не знаю технического термина, но термин, который предшествует знаку =, который меняет то, что происходит). Я думаю, что коммутатор является более контролируемой связью операторов 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") 
26

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

# 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" 
Смежные вопросы