例如,我在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语句对多个可能的匹配情况的问题的解决方案;我并不是想在实际节目中给元音或辅音分配信件。
答案 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"