R 中的 IF、ELSE、ELSE IF 语句

⚡ 智能摘要

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

  • 🔀 核心语法: 如果(条件){ } 否则 { } 当测试结果为 TRUE 时运行一个分支,当测试结果为 FALSE 时运行另一个分支。
  • 🔗 多个分支: R 将 else if 写成两个独立的单词;没有像 in 中那样的 elif 关键字。 Python.
  • ⚠️ 边界关怀: 使用大于等于和小于等于,这样就不会有值落入分支之间意想不到的空白处。
  • ⚡ 矢量化形式: ifelse(test, yes, no) 一次性评估整个向量,而 if 语句无法做到这一点。
  • 🗂️ 精确匹配: switch() 函数用一次查找替换了一长串相等性测试。
  • 🧮 Operator 选择: 单个 & 符号用于逐个元素操作,而双 & 符号用于 if 语句中的单个 TRUE 或 FALSE 值。

R语言中的If Else Else If语句

R语言中的if-else语句

An 如果是的话 语句会在条件为真时执行一段代码,在条件为假时执行另一段代码。在 R 语言中,语法为:

if (condition) {
    Expr1 
} else {
    Expr2
}

If Else 语句

检查名为 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")) { }

常见问题

if 语句处理单个 TRUE 或 FALSE 值,并控制执行哪个代码块。ifelse() 是一个向量化函数,它会测试向量中的每个元素,并返回一个结果向量。

在 if 和 while 循环中使用双精度形式,其中条件必须为唯一值,并且短路保护机制可以防止右侧执行错误。对于整个向量的逐元素测试,请使用单精度形式。

自 R 4.2 版本起,if 条件必须只有一个值(TRUE 或 FALSE);更长的向量现在会引发错误而不是警告。根据你的实际需求,可以使用 ifelse()、any() 或 all() 函数。

条件驱动特征工程规则,提前停止ping 训练过程中进行检查,并对模型输出做出阈值决策。向量化形式(例如 case_when())更佳,因为它们可以扩展到整个数据集。

是的。人工智能助手可以发现一些漏洞,例如边界值遍历所有分支,或者仅使用一个等号进行比较。请自行测试修正后的逻辑链在边界值上的表现。

总结一下这篇文章: