繁体   English   中英

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

[英]Lowering infix operator precedence in R?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM