簡體   English   中英

如何在 R 函數中使用 switch 語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM