匹配任何一组案例的 Switch 语句

Switch statement matching any of a set of cases

举个例子,我在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 语句的问题的解决方案;我并没有尝试在我的实际程序中将字母分配给元音或辅音。

如果您所做的只是一遍又一遍地执行相同的操作,我看不出有任何使用 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"    

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

If EXPR evaluates to a character string then that string is matched (exactly) to the names of the elements in .... If there is a match then that element is evaluated unless it is missing, in which case the next non-missing element is evaluated ...

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

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

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