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