个性化阅读
专注于IT技术分析

R中的条件和控制流

介绍

R中的条件和控制流1

控制流(来源: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中的条件和控制流2

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中的条件和控制流3

或运算符真值表

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中的条件和控制流4

非运算符真值表

让我们看一些例子!

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的更多信息, 请参加srcmini的Intermediate R课程。

赞(0)
未经允许不得转载:srcmini » R中的条件和控制流

评论 抢沙发

评论前必须登录!