Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 布尔运算符&&;及||_R_Logical Operators_Boolean Operations_Or Operator_And Operator - Fatal编程技术网

R 布尔运算符&&;及||

R 布尔运算符&&;及||,r,logical-operators,boolean-operations,or-operator,and-operator,R,Logical Operators,Boolean Operations,Or Operator,And Operator,根据,&和&(相应地和|)之间的区别在于前者是矢量化的,而后者不是 根据,我读到的区别类似于“And”和“AndAlso”(相应地“Or”和“OrElse”)之间的区别。。。 意思是: 不是所有的评估都必须是真的(即A、B或C总是真的,如果A是真的,那么停止评估,如果A是真的) 有人能在这里点灯吗? 此外,R中是否存在AndAlso和OrElse?&和|就是所谓的“短路”。这意味着,如果第一个操作数足以确定表达式的值,则它们不会计算第二个操作数 例如,如果&的第一个操作数为false,则计算第二

根据,
&
&
(相应地
|
)之间的区别在于前者是矢量化的,而后者不是

根据,我读到的区别类似于“And”和“AndAlso”(相应地“Or”和“OrElse”)之间的区别。。。 意思是: 不是所有的评估都必须是真的(即A、B或C总是真的,如果A是真的,那么停止评估,如果A是真的)

有人能在这里点灯吗?
此外,R中是否存在AndAlso和OrElse?

&
|
就是所谓的“短路”。这意味着,如果第一个操作数足以确定表达式的值,则它们不会计算第二个操作数

例如,如果
&
的第一个操作数为false,则计算第二个操作数没有意义,因为它无法更改表达式的值(
false&&true
false&&false
都为false)。当第一个操作数为真时,
|
也是如此


您可以在这里阅读更多信息:从该页的表格中可以看到,
&&
相当于VB.NET中的
,我假设您指的是它。

较短的是向量化的,这意味着它们可以返回向量,如下所示:

((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE  TRUE FALSE FALSE
最后,请参见中题为“and and and”的第8.2.17节。

关于的答案可能会产生误导,但有一定的真实性(见下文)。在R/S语言中,
&&
| |
仅计算第一个参数中的第一个元素。忽略向量或列表中的所有其他元素,而不考虑第一个元素的值。这些操作符被设计用来处理if(cond){}else{}
构造,并指导程序控制,而不是构造新的向量。。
&
|
运算符设计用于处理向量,因此它们将“并行”应用于最长参数的长度。在进行比较之前,需要对这两个向量进行评估。如果向量的长度不同,则循环使用较短的参数

当计算
&&
| |
的参数时,存在“短路”,即如果从左到右连续的任何值是确定的,则停止计算并返回最终值

> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3

只有当参数需要很长时间才能计算时,短路的优势才会显现出来。当参数是处理更大对象或具有更复杂数学运算的函数时,通常会出现这种情况。

我正在比较长度为1的逻辑。文档不清楚为什么它是控制流的首选。这是因为它使用了@Theo答案中的“短路”,因此具有更好的性能吗?不是。只需使用简短形式“&”-短路答案不正确。不,因为它保证只有一个正确/错误答案。较短的形式可能导致
c(TRUE,FALSE)
,而
if
语句可能不清晰。如果你确定每样东西的长度都是1,那么是的,两者都可以,而且你正确地认为“短路”是选择1的原因。不过要提醒一句,确保你100%确定它们只能是一个长度。否则,您可能会得到非常愚蠢的错误。@SFun28:是的,短路是流量控制首选的原因。除了更好的性能外,您可能不希望计算所有参数。
?is.R
中给出了一个规范示例,用于检查您是运行R还是S-Plus<代码>如果(存在)(“is.R”)&&is.function(is.R)&&is.R())
。如果
is.R
不存在,则您不希望计算
is.function(is.R)
,因为它将抛出错误。同样,如果
is.R
不是一个函数,您也不想像调用函数一样调用它。在当前版本的R inferno中,相关部分现在是8.2.17“and and and”,“短路”对我来说是一个新术语,但在我看来,描述它的答案似乎与你所说的
&&
| |
@DWin一致-在对长度1逻辑进行运算的情况下,它们是等价的,对吗?我试图理解为什么它们在控制流中是首选的,正如文档所述。此外,R是否具有“短路”结构?对于长度大于1的向量,它们并不等效。如果
&&
的参数是函数,且第一个参数为false,则第二个参数将不会被计算。这对于将计算两个参数的
&
ifelse
都不是真的。@dez93 true在“&&”之前不是决定性的。这些函数实际上并没有返回1,而是在分别返回2和3之前,作为
print
函数评估的副作用,打印1。“1”被打印出来,作为“真”在那一点上不是决定性的标志。在第5个实例中,控制台没有打印1,因为FALSE对于“&&”表达式是决定性的,因为第二个参数的值无关紧要。如果我将If子句的结果赋给一个命名变量,我们可以更清楚地看到这种情况。这应该足以证明它是短路:
f Theo,是的,您认为
&&
|
短路是正确的。但在比较短形式和长形式时,这实际上是一个相当小的问题;更重要的是要理解当输入是向量时,每一个都做了什么。@MTibbits事实上这不是一个完整的答案,但是关于短路的陈述是正确的。尝试
F&{message(“Boo!”);T}
F&{message(“Boo!”);T}
。在和处也可以看到类似的问题(现在以重复形式结束)。我认为和&&&and | |是非常糟糕的
a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found
> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3