假设我在R中有两个自定义中缀运算符:%foo%
和%bar%
。
我有两个运算符的表达式,例如:
x %foo% y %bar% z
如何确定%foo%
和%bar%
的运算符优先级?
如何更改优先级,例如%bar%
始终在%foo%
之前执行?在上面的示例中,这将与:
x %foo% (y %bar% z)
答案 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
无论优先级如何,两个软件包之一的结果可能都是错误的。