Как использовать оператор 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
}