在switch语句中匹配字符串

时间:2018-04-22 01:50:33

标签: r string switch-statement

我想根据字符串的前两个字符使用switch语句进行分支。在下面显示的示例中,我想返回" Apple"与#34; aabb"或" aacc"

test<-c("aabb", "aacc", "bbbb")

foo <- Vectorize(function(a) {
      switch(as.character(a),
            "^aa" = "Apple",
            "bbbb" = "Grape",
            "Unknown")

}, "a")

> foo(test)
aabb      aacc      bbbb 
"Unknown" "Unknown"   "Grape" 

如果存在完全匹配,我可以使该语句起作用,但我无法弄清楚如何仅使用前两个字符来获得匹配。也许有一种使用Regex的方法?如图所示,我尝试使用^来匹配字符串的开头(与grep一起使用),但它不起作用。

我想我可以在ifelse使用嵌套的grepl语句但是可以使用switch吗?

3 个答案:

答案 0 :(得分:4)

根据手册,switch这是不可能的,因为它只允许完全匹配:

  

开关(EXPR,...)

     

如果EXPR评估为字符串,则匹配该字符串   (确切地)到...中的元素名称。

但你可以在case_when中使用dplyr

foo <- function(x){
    dplyr::case_when(
        grepl('^aa', x) ~ 'Apple',
        x == 'bbbb' ~ 'Grape',
        TRUE ~ 'Unknown'
    )
}
foo(test)
# [1] "Apple" "Apple" "Grape"

答案 1 :(得分:2)

使用substr()提取前两个字母;使用setNames()传播全名而不是缩写到答案

> X = setNames(substr(test, 1, 2), test)
> sapply(X, switch, aa="Apple", bb = "Grape", "Unknown")
   aabb    aacc    bbbb 
"Apple" "Apple" "Grape" 

答案 2 :(得分:0)

这可能有效:

regex_switch<-function(.v,...)
{
  e<-enexprs(...)
  i<-min(which(str_detect(.v,names(e))))
  eval(e[[i]],parent.frame())
}
> map_chr(
   c("aaaa","bb","aabbaa"),
   regex_switch,
   "^aa"="Apple","^bbbb"="Grape","^*$"="Unknown"
)  
[1] "Apple"   "Unknown" "Apple"  
>