切换语句匹配任何一组案例

时间:2015-01-12 10:41:19

标签: r switch-statement

例如,我在R中有一个switch()语句,用于检查字母是否为元音,如下所示:

switch(trial_code[i],
     'a' = {letter[i] <- 'vowel'
     },
     'e' = {letter[i] <- 'vowel'
     },
     'i' = {letter[i] <- 'vowel'
     },
     'o' = {letter[i] <- 'vowel'
     },
     'u' = {letter[i] <- 'vowel'
     },
     {letter[i] <- 'consonant'}
)

我原本以为必须有一些方法同时检查多个案例,以整理我的代码。我试过以下,没有运气:

switch(trial_code[i],
     'a' | 'e' | 'i' | 'o' | 'u' = {letter[i] <- 'vowel'
     },
     {letter[i] <- 'consonant'}
)

根据列表中的任何值检查switch()语句的正确语法是什么?

编辑:我应该指出这是一个MWE。我试图找到解决使用switch语句对多个可能的匹配情况的问题的解决方案;我并不是想在实际节目中给元音或辅音分配信件。

2 个答案:

答案 0 :(得分:8)

switch的帮助页面介绍了如何执行此操作。

  

如果EXPR计算为字符串,则该字符串(确切地)与...中元素的名称匹配。如果匹配,那么除非缺少该元素,否则将对该元素进行评估,在这种情况下,将评估下一个非缺失元素......

然后继续给出一个例子,在你的情况下看起来像

switch(trial_code[i],
     'a' = ,
     'e' = ,
     'i' = ,
     'o' = ,
     'u' = {letter[i] <- 'vowel'},
     {letter[i] <- 'consonant'}
)

这可能是也可能不是解决问题的最佳方式,但这是指定多个值以产生相同效果的方法。

答案 1 :(得分:3)

如果您所做的一切都是一遍又一遍的相同操作,我都没有看到使用switch的任何理由。您可以使用简单的索引和%in%代替。

例如,假设这是你的字母矢量

set.seed(123)
(letter <- sample(letters, 20))
# [1] "h" "t" "j" "u" "w" "a" "k" "q" "x" "z" "p" "g" "r" "s" "b" "n" "c" "v" "y" "o"

然后,只需做

c('consonant', 'vowel')[(letter %in% c('a', 'e', 'i', 'o', 'u')) + 1]
#  [1] "consonant" "consonant" "consonant" "vowel"     "consonant" "vowel"     "consonant" "consonant"
#  [9] "consonant" "consonant" "consonant" "consonant" "consonant" "consonant" "consonant" "consonant"
# [17] "consonant" "consonant" "consonant" "vowel"