R 中的条件语句 - If, If-else, elseif, Nested if, Switch


2022 年 4 月 7 日, Learn eTutorial
4455

我们已经在之前的教程中讨论了控制结构的基础知识。在本教程中,我们将重点学习 R 编程语言中的条件语句或决策语句。让我们继续了解每种类型的条件语句。

条件语句进一步包括

  • If 语句
  • If-else 语句
  • If-else if-else 语句
  • 嵌套 if-else 语句
  • R-switch 语句
  • ifelse() 函数,if-else 语句的简写声明。

R 中的 If 控制语句

R 编程语言中的 If 控制结构评估给定条件或表达式是否满足。只有当 if 关键字后的条件满足时,花括号 {} 内的语句块才会被执行。条件应评估为 TRUE 或 FALSE。

如果条件为 TRUE,则紧随条件后的 {} 中的代码或语句将执行,否则控制将切换到紧随 if 语句之后的下一条语句。

以下流程图描述了 if 条件期间控制流的一般结构。

if control flowchart

语法


If(condition){
#Perform some instructions
       ……..
       ……..
}

示例


a = 5
b = 7
if(a<b){
  print(paste(a,"is smaller than ", paste(b)))
}

创建了两个变量 a 和 b,分别赋值为 5 和 7。条件是检查 a 中的值是否小于 b 中的值。语法 if(a

相应代码块的输出是


[1] "5 is smaller than  7"

让我们看看如果条件不满足会发生什么,a 的值被修改为 8,这大于 b 中的值 (7)。这里,if 语句后面的条件出错或不满足,因为 8<7 是 FALSE。


a = 8
b = 7
if(a<b){
  print(paste(a,"is smaller than ", paste(b)))
}
 print(paste(a ,"is greater than",paste(b)))
 print("The condition (a<b) is not satisfied")

上面代码生成的输出是


[1] "8 is greater than 7"
[1] "The condition (a<b) is not satisfied"

从输出中,您可以看到花括号 {} 之外的语句被执行并显示。如果表达式评估返回 false 结果,则控制流会跳转到紧随 if 条件之后的下一条语句。

R 中的 If-else 控制语句

If-else 是另一种控制结构,与 if 语句有些相似,但在这里您可以在 if 条件之后提供 else 部分。if 条件检查花括号 {} 内要评估的条件或表达式是 True 还是 False。如果它返回 true,则执行 {} 花括号内的代码块。另一方面,如果评估的表达式或条件为 false,则 else 部分中提供的代码将被执行。

让我们通过流程图了解 R 编程中的 if-else 控制结构

if-else control flowchart

if-else 控制结构的语法


If( condition) {
//do some instructions
}else {
//do some instructions
}

示例显示声明了两个变量 a 和 b,并分别赋值为 5 和 7。条件需要检查 a 中的值是否小于 a 中的值。条件 (a


a = 5
b = 7
if(a<b){
  print(paste(a,"is smaller than ", paste(b)))
  print("Terminated if condition")
}else{
print(paste(a ,"is greater than",paste(b)))
print("The condition (a<b) is not satisfied")
print("Executed else condition")
}

执行 if-else 控制结构的代码将生成以下输出,其中 5<7 被评估为 true 并显示 {} 内的代码


[1] "5 is smaller than  7"
[1] "Terminated if condition"

让我们检查 if 条件未能执行的情况,控制结构的 else 部分开始执行。我们将 a 的值修改为 8,这会影响条件 (a


a = 8
b = 7
if(a<b){
  print(paste(a,"is smaller than ", paste(b)))
  print("Terminated if condition")
}else{
print(paste(a ,"is greater than",paste(b)))
print("The condition (a<b) is not satisfied")
print("Executed else condition")
}

生成的输出是 else 部分中包含的语句。


[1] "8 is greater than 7"
[1] "The condition (a<b) is not satisfied"
[1] "Executed else condition"

比较 if 和 if-else 的语法以及我们讨论的示例,以清楚地了解这两种控制结构。在 if 语句中,它后面的代码被执行,在 if-else 中,当 if 的执行失败时,控制流序列会移动到执行 else 区域。

R 中的 If- else if - else 控制语句

控制结构可以通过在 if 和 else 语句之间添加 else if 语句进行自定义。R 提供了多个 else if 条件,可以包含在 ifelse 语句之间。

执行从评估 if 语句内的条件 (if(condition)) 开始,如果它返回 true,则执行 if(condition) 下的一组语句。假设 if 条件失败,则其余的多个 else if(condition) 开始逐个检查。满足的条件将被执行,其他的将被丢弃。末尾的 else 部分用于在所有条件都不满足时显示。

当 **if** 条件评估为 **TRUE** 时,则打印紧邻 if 条件下的语句代码。并忽略或跳过所有其余语句。

另一方面,当 **if** 条件为 FALSE 时,控制流会跳转到紧邻 if 语句下方的 **else if** 语句。评估 **else if** 条件,如果它满足或为 **TRUE**,则执行结果打印语句。R 会忽略下面的代码。当 if 和 else if 条件都不满足,即它们的结果保持为 FALSE 时,else 部分会执行。您可以在 if 和 else 代码语句之间有多个 else if 语句

 

if-else 控制结构的语法


if(condition){
   //do some instructions

}else if(condition){
   //do some instructions

}else{
   //do some instructions
}

表示 if-else 的流程图是

Switch control flowchart

示例


a = -3           #varaible a is assigned value -3

if(a<0){         #checks if (condition)
  print("negative number")
  print("Terminated if condition")
}else if(a>0){    #checks else  if (condition)
  print("positive number")
  print("Executed else if condition")
}else{            #checks  else  region
  print("a is zero")
}

代码中有三个不同的区域,它们根据表达式的评估而执行。假设 if(condition) 满足“a 小于 0” (a<0),则执行花括号内的语句序列。当 a 为 -3 且 if 条件满足时,结果输出将如下所示


[1] "negative number"
[1] "Terminated if condition"

当分配给 a 的值不是负数时,控制流会导航到我们描述的下一个语法部分,即 else if(condition)。else-if 后括号内的条件开始评估。如果示例中“a 大于 0” (a>0) 的条件被发现为真,则通过执行 else if 的花括号 {} 内的一系列代码来显示相应的输出。


[1] "positive number"
[1] "Executed else if condition"

如果所有条件都不满足,即评估表达式后为 False 值,则执行 else 部分中的代码。


[1] "a is zero"

R 中的嵌套 if

在 R 编程中,一个 **if 语句位于另一个 if 语句内部** 被定义为 **嵌套 if** 语句。

当 **if** 条件评估为 **TRUE** 时,控制立即跳转到 **嵌套 if** 条件并开始评估 if 语句中给定的条件。评估后,如果结果为 **TRUE** 或满足,则紧邻内部 **if** 条件下的花括号内的代码块将执行。另一方面,如果内部 if 条件为 FALSE,则执行 else 部分代码区域。到目前为止,我们讨论了外部 **if** 条件评估为 TRUE 的情况。

当外部 **if** 条件在评估后为 FALSE 时,控制流会跳转到末尾的 else 部分,并执行其花括号内给出的指令。

嵌套 if 的语法


if(condition) {  #outer if
     
    If(condition) { #inner if
        //do some instructions
    } else {
        //do some instructions
    }
} else {
    //do some instructions
}

Nested if control flowchart

该程序显示当外部 **if** 条件满足时,内部 **if** 条件被执行。在示例中,x 被赋值为 23。

  • 如果 (x>20) 被评估为 TRUE,则控制流跳转到紧邻的 if 条件 if (x > 0)。
  • 评估 if (x > 0),如果为 TRUE,则打印 {} 内的语句,否则执行紧随内部 if 条件之后的 else 区域。
  • 终止控制结构执行。

x < -23

if (x > 20) {
    print("x is greater than 20")
    if (x > 0) {
        print("x is greater than 0")
    } else {
        print("x is negative ")
    }
} else {
    print("x is zero.")
}

输出


[1] "x is greater than 20"
[1] "x is greater than 0"


程序显示当外部 **if** 条件为 FALSE 时,控制流跳转到 else 区域,而不执行嵌套 if 条件来终止控制结构。给定变量 x 的值为 23。

  • 如果 (x > 25) 为 FALSE,则控制流跳转到下一个内部 if 条件 (if (x > 0))
  • 控制流跳转到控制结构末尾的 **else** 部分,并打印 {} 内的语句块。
  • 控制结构终止

x < -23

if (x > 25) {
    print("x is greater than 20")
    if (x > 0) {
        print("x is greater than 0")
    } else {
        print("x is negative ")
    }
} else {
    print("x is greater than 25.")
}

输出


[1] "x is greater than 25."

R 中的 Switch 控制语句

**switch** 控制结构是另一种控制语句,它与 else-if 功能有些相似。R 编程语言使用 switch 语句有 m 个选项可供选择,并通过验证哪个 case 满足给定条件的要求来执行其中一个选项(case)。当条件与相应的 case 匹配时,该 case 将被执行。

因此,R 编程语言中的 switch() 语句会根据给定元素或值列表评估条件,并始终返回列表中第一个匹配的元素或值。

R 中的 switch 控制结构评估提供的表达式或条件,并相应地选择括号 () 中的参数,例如 case1 和 case2。

语法


switch(condition,case1 = “”,case2= “”,………., Default statement)

其中

  • **condition** 是要评估的表达式。
  • **………** 是备选列表,例如 case1、case2 等。
  • **Default statement** 在与条件匹配的 case 不存在时执行

第一个参数始终是要评估的条件或表达式。

考虑一个例子


a <- switch(
   4, #condition
  #(...... or case1,case2..)
  "red",              #case1
  "blue",             #case2
  "pink",             #case3
  "orange"            #case4
) 

print(a)  

switch 评估给定的条件 4,并返回列表中与它匹配的相应元素。这里条件 4 匹配 case4。让我们看看执行代码时显示的输出。


[1] "orange"

switch 控制结构的流程图是

Switch control flowchart

如果评估的条件是一个超出 switch 语句中 case 数量的整数,它将返回一个 NULL 值。在上面的例子中,当条件修改为 5 后,在搜索与每个 case 对应的匹配项后,没有现有 case 将返回一个 NULL 值。

看下面的代码片段

Switch control flowchart

可以提供默认语句而不是返回 NULL。下面是带有默认 case 的相同代码


a <- switch(          
  5,   #condition
  #(...... or case1,case2..)
  "red",              #case1
  "blue",             #case2
  "pink",             #case3
  "orange" ,          #case4
   print("no match found")  #default statement
  #no more cases exist to evaluate so returns default statement
)  

print(a)

当找不到匹配项且存在默认语句时的输出是


[1] "no match found"

注意:默认语句在 switch 控制结构中是可选的。

switch 控制结构以两种不同的方式进行评估,具体取决于初始参数是数字还是字符串。

  1. 如果与条件进行比较的值不是字符串,则将其强制转换为整数类型。
  2. 如果条件评估结果为字符串,则字符串与参数列表中给定的相应元素匹配并返回结果。
  3. 如果有多个元素与条件匹配,则只返回第一个匹配项作为输出。

    示例显示,在第一个示例中,字符串类型的红色与列表中的第一个 case 或元素匹配;在第二个示例中,蓝色与第一个元素根据它们在选项中的位置匹配。

    
    >  switch("color", "color" = "red", "shape" = "circle", "radius" = 5,"color" = "blue")
    [1] "red"
    > switch("color", "color" = "blue", "shape" = "circle", "radius" = 5,"color" = "red")
    [1] "blue"
    >
    
    

    注意:switch() 函数包含一个作为条件(表达式)的字符串进行测试。

  4. 如果需要评估的匹配元素缺失,则返回紧邻的下一个非缺失元素。

    考虑一个示例,用于评估表达式或条件与缺失匹配的情况,但返回匹配后的紧邻 case。在下面的示例中,要评估的条件是颜色,其中颜色对应的值缺失,因此在这些情况下,下一个 case 形状作为输出返回。同样地,尝试理解下一个示例。

    
    > switch("color", "color" = , "shape" = "circle", "radius" = 5,"color" = "blue")
    [1] "circle"
    > switch("color", "color" = , "radius" = 5,"shape" = "circle", "color" = "red")
    [1] 5
    
    
  5. 如果未找到匹配项,则返回 cas1, case2.........(列表的替代项)语法或参数中的未命名元素。

R 中的 ifelse() 函数

ifelse() 函数是 R 编程语言中一个非常有用的函数。它可以被视为一个立即 if 语句,这意味着它会评估 ifelse() 函数的第一个参数中的对象,如果它为 **TRUE**,则返回第二个参数中的对象。如果为 **FALSE**,则返回第三个参数中的对象。当您执行某些操作时,大多数输入都作为 向量 获取。

在 R 编程语言中,ifelse() 函数是条件语句 if-else 的简写形式。查看 if-else 的描述以回顾相同的概念。下面是 ifelse() 的语法。

语法


Ifelse(condition,TRUE,FALSE)

其中

  • **condition** 是要评估或测试的表达式。(参数 1)
  • **TRUE** 表示条件满足时要执行的语句或指令。(参数 2)
  • **FALSE** 表示条件不满足时要执行的语句或指令。(参数 3)

考虑一个检查人体健康的例子。假设我们将体重大于 40 的人归类为健康,其他人则为不健康。使用 c() 函数创建一个名为“wgt”的向量,它是一个用于检查条件的输入向量。第二个和第三个参数是 TRUE 和 FALSE。要检查的条件是体重是否大于 41。如果条件满足,则返回 1,否则返回 0(false)

示例


#ifelse(condition.TRUE,FALSE)
#Create a variable weight

wgt = c(39,48,42,52,60,41,38,49,58)

# we need to select weights greater than 41
#statements = weight >=41
#TRUE: people are fit(1)
#FALSE : people are not fit(0)

fit_enough = ifelse(wgt>=41,1,0)
print(fit_enough)

生成的输出如下所示,其中只有 2 人体重为 39、38 不健康,用值 0 表示。


[1] 0 1 1 1 1 1 0 1 1

无需编写单独的 if 和 else 代码,两者都集成在单个 ifelse() 函数中,以一步检查两个条件。