【问题标题】:How to use the switch statement in R functions?如何在 R 函数中使用 switch 语句?
【发布时间】:2012-05-10 17:34:59
【问题描述】:

我想在 R 中为我的函数使用语句 switch() 以根据函数参数的值触发不同的计算。

例如,在 Matlab 中,您可以通过编写来做到这一点

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

我发现这篇文章 - switch() statement usage - 解释了如何使用 switch,但对我没有太大帮助,因为我想执行更复杂的计算(矩阵运算)而不是简单的 mean

【问题讨论】:

    标签: r switch-statement


    【解决方案1】:

    好吧,switch 可能并不是真的要像这样工作,但你可以:

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

    ...每个 case 都是一个表达式 - 通常只是一个简单的东西,但在这里我使用了一个花括号,以便您可以在其中填充任何您想要的代码...

    【讨论】:

    • 有没有办法在不比较字符串的情况下做到这一点?这似乎效率很低。
    • 作为switch() 的新用户,我想知道您为什么说它不适合这样工作。您还希望 switch 语句做什么?
    【解决方案2】:

    各种切换方式 ...

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

    【讨论】:

      【解决方案3】:

      我希望这个例子有帮助。您可以使用花括号来确保您已将所有内容包含在切换器更换器中(抱歉,不知道技术术语,但 = 符号之前的术语会改变发生的情况)。我认为 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")
      

      【讨论】:

        【解决方案4】:

        这是对 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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-10
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 2018-08-31
          相关资源
          最近更新 更多