[英]How to use the switch statement in R functions?
我想在 R 中使用語句switch()
來根據函數參數的值觸發不同的計算。
例如,在 Matlab 中,您可以通過編寫
switch(AA)
case '1'
...
case '2'
...
case '3'
...
end
我發現這篇文章 - 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"
我希望這個例子有幫助。 您可以使用花括號來確保您已將所有內容都包含在切換器轉換器中(對不起,不知道技術術語,但在 = 符號之前的術語會改變所發生的情況)。 我認為 switch 是一組更可控的if () {} else {}
語句。
每次 switch 函數都是相同的,但我們提供的命令發生了變化。
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.