我正在尝试为 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/