R中的条件和控制流

介绍

R中的条件和控制流

文章图片
控制流(来源:w3schools)
关系运算符
关系运算符或也称为比较器, 可以帮助你查看一个R对象与另一个R对象的关系。例如, 你可以检查两个对象是否相等, 这可以借助==(double equal)符号来完成。两端均为TRUE的逻辑运算符将返回逻辑值TRUE, 因为TRUE等于TRUE, 如下所示。
TRUE == TRUE

TRUE

但是, 如果一侧为TRUE, 另一侧为FALSE, 则将获得逻辑值FALSE作为输出。
TRUE == FALSE

FALSE

除了逻辑变量, 你还可以检查其他类型的相等性。
让我们比较一下字符串和数字。
100 == 100

TRUE

100 == 200

FALSE

'tutorial' == 'R'

FALSE

  • 等式运算符的对立面是不等式运算符, 它由!-符号(感叹号后跟等于)的组合给出。
现在导致FALSE的所有条件都将变为TRUE, 让我们检查一下!
100 != 200

TRUE

'tutorial' != 'R'

TRUE

TRUE != FALSE

TRUE

类似地, 不等式运算符也可以用于数值和其他R对象, 例如矩阵, 向量和列表。
  • 如果要检查是否给定了两个R对象, 其中一个大于或小于另一个。好吧, 当然, 你可以使用简单的< 和> 号(小于号和大于号)。
    我们首先来看一个数字示例。
2 > 10

FALSE

-200 < 0

TRUE

如你所见, 为什么$ 2 $不大于$ 10 $或$ -200 $为什么小于$ 0 $是不言而喻的。但是, 字符串或字符呢?让我们看看如何实现它。
看起来R优先考虑字母顺序, 同时决定哪个字符串或字符大于另一个。
在下面的示例中, t按照字母顺序排在R之后;因此, t大于R。
'tutorial' > 'RRRRRRRRR'

TRUE

重要的是要注意, 在R和几乎所有编程语言中, TRUE在数值上解释为1, FALSE在数值上解释为0。因此, 基于此类推, TRUE将大于FALSE。
TRUE > FALSE

TRUE

  • 你还可以检查一个R对象是否大于或等于(> =)(或小于或等于< =)另一个R对象。为此, 可以将小于或等于符号与等号结合使用。这意味着, 如果两个条件(小于或等于/大于或等于)之一为TRUE, 则完整条件将为TRUE。
5 > = 5 # 5 is not greater than 5 but is equal, hence, it returns TRUE.

TRUE

5 > = 10

FALSE

你可以在此srcmini教程中了解R数据类型。它表明R在处理列表, 矩阵和向量方面相当出色。
R比较器可以处理R向量吗?让我们找出答案。
例如, 你有一个行向量, 其中记录了最近10天在最近的srcmini教程中获得的视图数。现在, 你想知道哪几天收到的观看次数超过或等于100。你可以使用现成的大于号。
srcmini_views < - c(100, 20, 5, 200, 60, 88, 190, 33, 290, 64)

length(srcmini_views)

10

srcmini_views > = 100

  1. true
  2. false
  3. false
  4. true
  5. false
  6. false
  7. true
  8. false
  9. true
  10. false
从上面的输出中可以看到, 对于第一个, 第四个, 第七个和第九个, 结果为TRUE, 这些天的视图大于或等于100。
同样, 你也可以比较两个向量甚至两个矩阵。
youtube_views < - c(10, 20, 1000, 64, 100, 9, 19, 3, 90, 4)

因此, 通过这种方式, 你可以构建一个简单易用的应用程序, 以查找srcmini教程的观看时间多于youtube视频观看的时间, 反之亦然。
这在R中的工作方式是将两个向量逐个元素地进行比较。例如, 在下面的输出中, 如果考虑两个向量中的第一个元素, 则可以看到srcmini视图向量的值为100, 另一个向量的值为10, 因此返回TRUE。
srcmini_views > youtube_views

  1. true
  2. false
  3. false
  4. true
  5. false
  6. true
  7. true
  8. true
  9. true
  10. true
让我们快速比较一下数字。如果你还记得基础数学, 则有一个称为BODMAS(或PEMDAS)的规则, 这表示除法, 乘法, 加法和减法的括号, 以此为基础来求解任何数学方程式。因此, 你将使用相同的规则来解决以下两个R表达式。
-6 * 5 + 2 > = -10 + 1 #on left hand side multiplication will be done first and then addition as per BODMAS

FALSE

比较矩阵 R处理不同数据结构进行比较的能力并不仅限于矢量。矩阵和关系运算符也可以无缝协作!
现在, srcmini和YouTube数据已代替矢量(如上例所示)存储在称为视图的矩阵中。第一行包含srcmini信息。第二行是YouTube信息。你将使用R的内置矩阵函数在上一个示例中创建的srcmini和youtube向量的帮助下创建矩阵。
srcmini_views < - c(100, 20, 5, 200, 60, 88, 190, 33, 290, 64)

youtube_views < - c(10, 20, 1000, 64, 100, 9, 19, 3, 90, 4)

views < - matrix(c(srcmini_views, youtube_views), nrow = 2, byrow = TRUE)

views

A matrix: 2 × 10 of type dbl
100 20 5 200 60 88 190 33 290 64
10 20 1000 64 100 9 19 3 90 4
让我们找出什么时候srcmini和youtube的观看次数等于20。
views == 20

A matrix: 2 × 10 of type lgl
false true false false false false false false false false
false true false false false false false false false false
大!因此, 你已经了解了关系运算符的工作原理, 现在让我们继续进行逻辑运算符。
逻辑运算符
R通过提供以下逻辑运算符来帮助你组合关系运算符的结果:
  • AND(&)运算符
  • OR(|)运算符
  • NOT(!)运算符
让我们看看它们中的每一个。
  • AND运算符:和其他任何编程语言一样, R的AND运算符采用两个逻辑值, 仅返回TRUE, 并且仅在两个值都为true时返回, 否则返回false。
R中的条件和控制流

文章图片
AND运算符真值表
Let's look at some of the self-explanatory examples.

TRUE & TRUE # 1.1 = 1

TRUE

TRUE & FALSE # 1.0 = 0

FALSE

FALSE & FALSE # 0.0 = 0

FALSE

FALSE & TRUE # 0.1 = 0

FALSE

同样, 你可以将比较器的结果与这些运算符一起使用, 而不是像上面那样使用逻辑值。
x < - 100

x < 200 & x > = 100# since x is less than 200 but less than equal to 100, so it returns TRUE.

TRUE

x < 200 & x > 100 # this holds FALSE since the second comparison i.e. x greater than 100 is false.

FALSE

  • OR运算符:OR运算符与AND运算符非常相似。但是, 唯一的主要区别在于, 如果OR表达式使用的逻辑值之一为TRUE, 则整个OR表达式为TRUE。
R中的条件和控制流

文章图片
或运算符真值表
Let's look at some of the self-explanatory examples.

TRUE | TRUE # 1 + 1 = 1

TRUE

TRUE | FALSE # 1 + 0 = 0

TRUE

FALSE | FALSE # 0 + 0 = 0

FALSE

FALSE | TRUE # 0 + 1 = 0

TRUE

让我们使用与上面使用的相同的数字示例, 但是这次结果应该有所不同。
x < - 100

x < 200 | x > 100 # this holds TRUE since the first comparison i.e. x less than 100 is True.

TRUE

  • NOT运算符:这是最容易理解的运算符, 它否定了它所应用的逻辑运算符, 或者你可以将其视为与逻辑运算符相反的运算符。
R中的条件和控制流

文章图片
非运算符真值表
让我们看一些例子!
a = 1

!a # this returns false since not of a will be 0 which is FALSE.

FALSE

a = 0

!a #similar to the above example this return TRUE since a = 0 and not of a is 1.

TRUE

让我们看一下在某些情况下, NOT运算符在处理R的内置函数时会有所帮助。
is.numeric(5) #returns TRUE since 5 is numeric

TRUE

!is.numeric(5) #not of the same will return FALSE

FALSE

is.numeric('aditya')

FALSE

下面的示例在处理数字和字符串数据混合的情况下非常有用, 并且你想从列表中过滤掉字符串/字符而只保留数字数据。
!is.numeric('aditya')

TRUE

最后, 让我们找出逻辑运算符如何在向量和矩阵上起作用。
a < - c(FALSE, TRUE, FALSE)

b < - c(TRUE, TRUE, FALSE)

a & b # AND operator

  1. false
  2. true
  3. false
a | b # OR operator

  1. true
  2. true
  3. false
基于以上两个输出, 很明显在关系运算符中类似于矢量。逻辑运算符还按元素执行操作。
但是, NOT运算符一次只能应用于一个矢量, 也可以应用于两个矢量的结果。
!a

  1. true
  2. false
  3. true
!b

  1. false
  2. false
  3. true
在下面的示例中, NOT运算符在方括号之外, 这意味着它将应用于a和b的结果。以下运算符也可以称为NOR(非或)运算符。
!(a | b) # NOR operator

  1. false
  2. false
  3. true
在继续执行条件语句之前, 让我们做一个小练习。
你具有与上面定义的矢量形式相同的srcmini教程视图。让我们使用R的tail方法从其中提取最后一个元素。
last < - tail(srcmini_views, 1) print (last)

[1] 64

让我们找出最后一个元素是否小于100或大于100。
last < 100 | last > 100

TRUE

由于最后一个元素小于100, 因此表达式之一满足该条件, 因此它返回TRUE。
让我们继续本教程的最后一个主题, 即条件语句!
条件语句
到现在为止, 你已经了解了关系运算符, 它告诉你R对象与彼此之间的关系以及逻辑运算符, 它们允许你组合逻辑值。 R提供了一种组合所有这些运算符并使用结果更改R脚本行为的方式。这样, 让我们??进入if和else语句。
if条件的语法定义如下:if(condition){// expression} if语句接受一个条件(在括号内), 该条件可以与关系或某些逻辑运算符相关, 如果该条件为TRUE, 则执行与条件关联的R代码(位于大括号内)。很简单, 不是吗?
让我们通过一个例子来理解它。
假设你有一个变量x, 它等于-10, 现在, 你将放置一个条件来检查x是否大于零, 并用NOT运算符取反。由于条件为TRUE, 因此将执行大括号内的R代码。
x < - -10

if (!x > 0){ print("x is a negative number") }

[1] "x is a negative number"

但是, 如果删除NOT运算符, 则条件将变为FALSE, 并且不会执行大括号内的代码。
if (x > 0){ print("x is a positive number") }

现在让我们借助语法来了解else语句。 if(condition){// expression1} else {// expression2}与if语句不同, else语句不需要显式条件, 它必须与if语句结合使用。仅当if`语句的条件不为TRUE时, 才执行与else语句关联的R代码。
让我们以相同的if语句示例来了解else语句。
x < - -10

if (x > 0){ print("x is a positive number") }else{ print("x is a negative number") }

[1] "x is a negative number"

在上面的示例中, 由于if语句无效, 因此执行else语句。
与if和else语句类似, 你可以在else和else语句之间使用else if语句。当不满足if语句条件时执行。简而言之, else语句的优先级最高。 if(condition){// expression1} else if(condition){// expression2} else {// expression3}
x < - 0

if (x > 0){ print("x is a positive number") }else if (x == 0){ print("x is zero") }else{ print("x is a negative number") }

[1] "x is zero"

主要原因是, 我们使用else if语句的原因之一是当前条件不是互斥的, 这意味着它们可以同时发生。让我们看一个例子。
x < - 12

if (x %% 3 == 0){ print("x is divisible by 3") }else if (x %% 4 == 0){ print("x is divisible by 4") }else{ print("x is neither divisible by 3 nor by 4") }

[1] "x is divisible by 3"

在上面的示例中, if条件变为TRUE, 因此R退出控制结构并且不进入下一个语句, 即使else if条件的求值为TRUE时, 它不会执行。但是, 如果你将使用另一个if条件, 那么将执行if语句, 而不是else if语句。
恭喜你完成了本教程。
对于想学习R编程语言的初学者来说, 本教程是一个很好的起点。作为一项好练习, 你可能希望将关系和逻辑运算符作为条件语句中的条件应用。
像R中的实用程序和使用R的机器学习中的R一样, 仍有一些主题尚未涵盖在R中, 敬请期待!
请随时在下面的评论部分中提出与本教程相关的任何问题。
【R中的条件和控制流】如果你想了解有关R的更多信息, 请参加srcmini的Intermediate R课程。

    推荐阅读