我想在 R 中为我的函数使用语句switch()
来根据函数参数的值触发不同的计算。
例如,在 Matlab 中,您可以通过编写
switch(AA)
case '1'
...
case '2'
...
case '3'
...
end
我发现这个 post- switch() 语句用法-解释了如何使用switch
,但对我没有真正的帮助,因为我想执行更复杂的计算(矩阵运算)而不是简单的mean
.
我想在 R 中为我的函数使用语句switch()
来根据函数参数的值触发不同的计算。
例如,在 Matlab 中,您可以通过编写
switch(AA)
case '1'
...
case '2'
...
case '3'
...
end
我发现这个 post- switch() 语句用法-解释了如何使用switch
,但对我没有真正的帮助,因为我想执行更复杂的计算(矩阵运算)而不是简单的mean
.
好吧,switch
可能并不是真的要像这样工作,但你可以:
AA = 'foo'
switch(AA,
foo={
# case 'foo' here...
print('foo')
},
bar={
# case 'bar' here...
print('bar')
},
{
print('default')
}
)
...每个案例都是一个表达式 - 通常只是一个简单的事情,但在这里我使用一个花括号,这样你就可以在其中填充任何你想要的代码......
各种切换方式...
# 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"
我希望这个例子有帮助。您可以使用花括号来确保您已将所有内容包含在 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")
这是对 R 中缺少的“Select cond1, stmt1, ... else stmtelse”构造的更一般的答案。它有点气,但它的工作原理类似于 C 中存在的 switch 语句
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
}