在R中,如何确定用户定义的中缀运算符的运算符优先级?

时间:2015-06-25 08:21:42

标签: r operators operator-precedence infix-notation

假设我在R中有两个自定义中缀运算符:%foo%%bar%

我有两个运算符的表达式,例如:

x %foo% y %bar% z

如何确定%foo%%bar%的运算符优先级?

如何更改优先级,例如%bar%始终在%foo%之前执行?在上面的示例中,这将与:

相同
x %foo% (y %bar% z)

2 个答案:

答案 0 :(得分:5)

我不认为这是明确记录的,但R language documentation中隐含的是中缀运算符具有相同的优先权,因此从左到右执行。这可以证明如下:

`%foo%` <- `+`
`%bar%` <- `*`
1 %bar% 2 %foo% 3
#5
1 %foo% 2 %bar% 3
#9

我能想到的唯一选择是重新定义一个现有的运营商来做你想做的事。但是,这本身会产生影响,因此您可能希望将其限制在函数内。

还值得注意的是,使用substitute不会更改首次编写表达式时已设置的运算符优先级:

eval(substitute(2 + 2 * 3, list(`+` = `*`, `*` = `+`)))
#10
2 * 2 + 3
#7

答案 1 :(得分:2)

  

如何确定%foo%和%bar%?

的运算符优先级

你做不到。 R不允许您设置自定义中缀运算符的优先级。用户定义的中缀运算符具有默认的优先级规则,这意味着它们将从左到右进行计算。

这种限制的一个原因是,为中缀运营商实施和维护一组优先级规则是极其困难和限制的。想象一下,你加载了一个R包,它附带了一些自定义中缀运算符。然后,需要定义包中的中缀运算符与您创建的%foo%%bar%之间的关系。这很快就会成为一个严重的负担。

例如,假设包1包含中缀运算符%P1IF%,包2包含中缀运算符%P2IF%。每个包都定义了它的中缀运算符应该具有最高优先级。如果要同时加载第一个包和第二个包,则以下表达式将是未定义的:

v1 %P1IF% v2 %P2IF% v3
(v1 %P1IF% v2) %P2IF% v3     # package 2 doesn't expect this
v1 %P1IF% (v2 %P2IF% v3)     # package 1 doesn't expect this

无论优先级如何,两个软件包之一的结果可能都是错误的。