介绍
控制流(来源: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
- true
- false
- false
- true
- false
- false
- true
- false
- true
- 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
- true
- false
- false
- true
- false
- true
- true
- true
- true
- 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
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
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。
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。
或运算符真值表
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运算符:这是最容易理解的运算符, 它否定了它所应用的逻辑运算符, 或者你可以将其视为与逻辑运算符相反的运算符。
非运算符真值表
让我们看一些例子!
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
- false
- true
- false
a | b # OR operator
- true
- true
- false
基于以上两个输出, 很明显在关系运算符中类似于矢量。逻辑运算符还按元素执行操作。
但是, NOT运算符一次只能应用于一个矢量, 也可以应用于两个矢量的结果。
!a
- true
- false
- true
!b
- false
- false
- true
在下面的示例中, NOT运算符在方括号之外, 这意味着它将应用于a和b的结果。以下运算符也可以称为NOR(非或)运算符。
!(a | b) # NOR operator
- false
- false
- 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课程。