r中“!TRUE+TRUE”的奇怪结果

我遇到了一个非常棘手的问题。声明是这样的:

!TRUE + TRUE
[1] FALSE

结果是 FALSE,而不是数字 1。但是当我将 () 添加到 !TRUE 时:

(!TRUE) + TRUE
[1] 1

结果正如我所料。以下是我对语句“!TRUE + TRUE”的看法。

好像是把 TRUE 强制为数字 1,将 1 + 1 计算为 2,然后将数字 2 强制为逻辑值 TRUE,最后 !2 等于 FALSE。在这种情况下,运算符优先级为“!” 不是第一个。

那么R如何运行这种语句,我在R源代码中没有找到原因。有没有类似的例子?

回答

这是运算符优先级的简单结果,请参阅?Syntax

:: :::  access variables in a namespace
$ @ component / slot extraction
[ [[    indexing
^   exponentiation (right to left)
- + unary minus and plus
:   sequence operator
%any%   special operators (including %% and %/%)
* / multiply, divide
+ - (binary) add, subtract
< > <= >= == != ordering and comparison
!   negation
& &&    and
| ||    or
~   as in formulae
-> ->>  rightwards assignment
<- <<-  assignment (right to left)
=   assignment (right to left)
?   help (unary and binary)

即,+在之前评估!,因此您的表达式被评估为

!(TRUE + TRUE)

IE, FALSE

另一种查看方式:查看 AST。了解这一点的廉价方法是:

as.list(substitute(!TRUE + TRUE))
# [[1]]
# `!`

# [[2]]
# TRUE + TRUE

即,!是最外层调用,并且TRUE+TRUE首先完成。

解决此问题的更高级方法是使用lobstr具有更好可视化 AST 功能的包:

lobstr::ast(!TRUE + TRUE)
# ??`!` 
# ????`+` 
#   ??TRUE 
#   ??TRUE 


以上是r中“!TRUE+TRUE”的奇怪结果的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>