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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

# 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"

Ответ 4

Это более общий ответ на отсутствующую конструкцию "Select cond1, stmt1,... else stmtelse" в R. Это немного заурядно, но работает аналогично оператору switch, присутствующему в C

while (TRUE) { if (is.na(val)) { val <- "NULL" break } if (inherits(val, "POSIXct") || inherits(val, "POSIXt")) { val <- paste0("#", format(val, "%Y-%m-%d %H:%M:%S"), "#") break } if (inherits(val, "Date")) { val <- paste0("#", format(val, "%Y-%m-%d"), "#") break } if (is.numeric(val)) break val <- paste0("'", gsub("'", "''", val), "'") break }