我试图为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
答案 0 :(得分:0)
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
可以想象,这可以允许您编写一个函数,该函数可以修改表达式以使!
的优先级高于%->%
。
或者,您的函数可以执行文本替换,以在解析之前将%->%
或!
更改为不同的优先级运算符,然后在评估之前将其更改回。