R 中的 IF、ELSE、ELSE IF 语句
⚡ 智能摘要
R 语言中的 if-else 和 else if 语句根据逻辑条件选择执行哪个代码块。本教程将介绍双分支形式、多分支链、向量化的 if-else() 函数以及用于精确匹配的 switch() 函数。

R语言中的if-else语句
An 如果是的话 语句会在条件为真时执行一段代码,在条件为假时执行另一段代码。在 R 语言中,语法为:
if (condition) { Expr1 } else { Expr2 }
检查名为 quantity 的变量是否大于 20。如果大于 20,则代码打印“你卖了很多!”,否则打印“今天不够”。
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
输出:
## [1] "You sold a lot!"
注意:缩进不会改变 R 运行代码的方式,但一致的缩进能使冗长的条件语句保持可读性。另请注意,右大括号和 else 关键字必须位于同一行,否则 R 会将 if 代码块视为已完成并抛出错误。
R语言中的else if语句
链式进一步测试 否则R语言没有elif关键字,也就是说…… Python在 R 语言中,你需要分别输入这两个词,并且可以根据需要添加任意数量的分支。语法如下:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
假设你想要三种结果:低于 20 次打印“今天不够”,介于 20 次和 30 次之间打印“普通的一天”,高于 30 次打印“多么美好的一天!”。
您可以尝试改变数量。
# Create the variable quantity quantity <- 10 # Create multiple condition statement if (quantity < 20) { print('Not enough for today') } else if (quantity >= 20 & quantity <= 30) { print('Average day') } else { print('What a great day!') }
输出:
## [1] "Not enough for today"
例如2:
增值税税率因产品类别而异。假设有三种产品类别,每种类别都有其自身的税率:
| 分类 | 产品 | 增值税 |
|---|---|---|
| A | 书籍、杂志、报纸等。 | 8% |
| B | 蔬菜、肉类、饮料等。 | 10% |
| C | T 恤、牛仔裤、长裤等。 | 20% |
else if 链将正确的价格应用于客户购买的任何商品:
category <- 'A' price <- 10 if (category =='A'){ cat('A vat rate of 8% is applied.','The total price is',price *1.08) } else if (category =='B'){ cat('A vat rate of 10% is applied.','The total price is',price *1.10) } else { cat('A vat rate of 20% is applied.','The total price is',price *1.20) }
输出:
## A vat rate of 8% is applied. The total price is 10.8
R 语言中的 ifelse() 向量化函数
if 语句只能处理一个值。如果传入一个向量,R 4.2 或更高版本会报错,因为条件必须是单个 TRUE 或 FALSE。ifelse() 函数通过一次性检查每个元素并返回一个相同长度的向量来解决这个问题。
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
输出:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
这三个参数分别是测试条件、测试结果为真时返回的值以及测试结果为假时返回的值。这三个参数都会被循环使用,每次循环使用后返回的值都相同。
嵌套 ifelse() 会在整个向量中复制一个 else if 链:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
有两个限制值得注意。`ifelse()` 会从结果中删除诸如因子水平和日期类之类的属性,并且它会对每个元素执行两个分支,因此当其中一个分支开销很大时,就会造成资源浪费。dplyr 的替代方案 case_when() 完全避免嵌套,并保持类型不变:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
R语言中的switch()语句
当每个分支都检查同一个变量是否相等时,冗长的 else if 语句链会变得难以阅读。switch() 函数用一次查找代替了这种冗长的语句链。
category <- 'A' price <- 10 vat <- switch(category, 'A' = 1.08, 'B' = 1.10, 'C' = 1.20, 1.20) # the unnamed last value is the default cat('The total price is', price * vat)
它的行为遵循以下三条规则:
- 对于字符型参数,`switch()` 函数会精确匹配名称,不支持部分匹配和模式匹配。
- 未命名的最终元素用作默认值。如果没有此元素,则不匹配的值将返回 NULL(不显式返回),这是导致静默错误(minor bug)的常见原因。
- 如果使用整数参数,switch() 会按位置进行选择:switch(2, “a”, “b”, “c”) 返回 “b”。
使用 switch() 函数来精确匹配一组固定的值,而使用 else if 函数来处理 switch() 函数无法表达的范围和复合条件。要对序列重复应用某个条件,请将其与 else if 函数结合使用。 for循环 或者 while循环.
合乎逻辑 OperaR 条件下的 tors
构成条件的运算符彼此行为不同,而且这种差异很重要。
| Opera器 | 意 | 使用它 |
|---|---|---|
| & | 逐元素与 | ifelse()、filter()、整个向量 |
| && | 单值与运算、短路 | 如果 () 并且当 () |
| | | 元素级或 | ifelse()、filter()、整个向量 |
| || | 单值或门,短路 | 如果 () 并且当 () |
| ! | 不,否定了测试结果。 | 任何地方 |
| %在% | 这个值是否属于这个集合? | 取代长 OR 链 |
为什么短路很重要。 双式推理一旦得出答案就会停止,因此当左侧已经确定结果时,右侧永远不会被求值。这使得编写守卫子句成为可能:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
与多个数值进行比较。 尽量使用 %in% 而不是链式相等性测试,这样既简洁又不容易出错:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
最后提醒一句:单个等号(==)用于赋值,不用于比较。条件语句中一定要使用 ==。
R 语言中的条件语句:快速参考
本教程中使用的所有结构如下所示:
| 目的 | Code |
|---|---|
| 两个分支 |
if (cond) { a } else { b } |
| 多个分支 |
if (c1) { a } else if (c2) { b } else { c } |
| 向量化条件 |
ifelse(test, yes, no)
|
| 向量上的多分支 |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| 精确匹配查找 |
switch(x, "A" = 1, "B" = 2, 0) |
| 会员资格测试 |
if (x %in% c("A", "B")) { } |

