r - 降低R中的中缀运算符优先级?

标签 r logical-operators boolean-logic propositional-calculus

我正在尝试为 R 中的逻辑变量创建一个“隐含”运算符,以使命题演算更容易。但是,它似乎与否定运算符一起玩得并不好。正如此处的最后 4 行所示,我必须将取反变量括在括号中才能使蕴涵运算符正常工作。

我怀疑运算符优先级是问题,但我不确定。从我读到的内容来看,没有办法改变中缀运算符的优先级。有没有办法重新定义 implies()以便 (!q) %->% (!p) 中的括号没有必要吗?

> implies <- function(p, q) !p | q
> "%->%" <- implies
> 
> p <- c(TRUE, TRUE, FALSE, FALSE)
> q <- c(TRUE, FALSE, TRUE, FALSE)
> p %->% q
[1]  TRUE FALSE  TRUE  TRUE
> !q %->% !p
[1]  TRUE FALSE FALSE FALSE
> (!q) %->% !p
[1]  TRUE FALSE  TRUE  TRUE

最佳答案

R 没有任何方法来控制运算符的优先级。它在帮助页面 ?Syntax 中有描述.你的问题是否定的优先级低于特殊运算符,所以

!q %->% !p

被解析为
!(q %->% !p)

最好的建议可能是不要尝试将 R 用于您正在处理的项目,因为它并不是真正为那种事情而设计的。但是,您想要的可能是可能的:R 允许您从表达式中查看解析树,并告诉括号出现的位置:
> getParseData(parse(text="!q %->% !p"))
   line1 col1 line2 col2 id parent   token terminal text
11     1    1     1   10 11      0    expr    FALSE     
1      1    1     1    1  1     11     '!'     TRUE    !
10     1    2     1   10 10     11    expr    FALSE     
2      1    2     1    2  2      4  SYMBOL     TRUE    q
4      1    2     1    2  4     10    expr    FALSE     
3      1    4     1    7  3     10 SPECIAL     TRUE %->%
9      1    9     1   10  9     10    expr    FALSE     
5      1    9     1    9  5      9     '!'     TRUE    !
6      1   10     1   10  6      8  SYMBOL     TRUE    p
8      1   10     1   10  8      9    expr    FALSE     

可以想象,这可以让您编写一个可以修改表达式以给出 ! 的函数。高于 %->% 的优先级.

或者,您的函数可以只进行文本替换来更改 %->%!在解析之前转换为不同的优先运算符,然后在评估之前将其改回。

关于r - 降低R中的中缀运算符优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54219911/

相关文章:

r - 计算R中逻辑矩阵的列数

linux - DMwR linux 缺少软件包

java - 非短路逻辑运算符存在的原因

javascript - 比较大于 1000 的数字时奇怪的 JavaScript 行为

c++ - 如何对卡诺图中的单元格进行分类

c# - 如何在NEST中进行 Assets 汇总和/或组合?

在数据框的一个单元格中返回多个匹配值

XML 到缺少节点的数据框

python - 测试所有 N 个变量是否不同

c++ - 这段代码中 "and N"有什么用?