如何在R函数中使用switch语句?


80

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

例如,在Matlab中,您可以通过编写

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

我发现了此post- switch()语句用法-解释了如何使用switch,但对我没有太大帮助,因为我想执行更复杂的计算(矩阵运算)而不是简单的操作mean

Answers:


110

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

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

...每种情况都是一个表达式-通常只是一个简单的事情,但是在这里我使用了一个卷曲块,以便您可以在其中填充任何想要的代码...


6
有没有一种方法可以不与字符串进行比较?这似乎效率很低。
Jules GM

9
作为的新用户switch(),我想知道为什么您说它不是像这样工作。您还希望switch语句还能做什么?
eric_kernfeld

46

各种切换方式...

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

41

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

1

这是对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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.