[英]In R, how can I determine the operator precedence of user defined infix operators?
假设我在 R 中有两个自定义中缀运算符: %foo%
和%bar%
。
我有使用这两个运算符的表达式,例如:
x %foo% y %bar% z
如何确定%foo%
和%bar%
的运算符优先级?
如何更改优先级,例如, %bar%
总是在%foo%
之前执行? 在上面的示例中,这将与以下内容相同:
x %foo% (y %bar% z)
我不认为这是明确记录的,但在R语言文档中隐含的是中缀运算符都具有相同的优先级,因此从左到右执行。 这可以证明如下:
`%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
如何确定%foo%和%bar%的运算符优先级?
你不能。 R不允许您设置自定义中缀运算符的优先级。 用户定义的中缀运算符具有默认的优先级规则,这意味着它们将从左到右进行计算。
这种限制的一个原因是,对于中缀运算符来说,实现和维护一组优先级规则是极其困难和限制的。 想象一下,你加载了一个R包,它附带了一些自定义中缀运算符。 然后,需要定义包中的中缀运算符与您创建的%foo%
和%bar%
。 这将很快成为一个严重的负担。
例如,假设包1包含中缀运算符%P1IF%
,包2包含中缀运算符%P2IF%
。 每个包都定义了它的中缀运算符应该具有最高优先级。 如果要加载包1和包2,则以下表达式将是未定义的:
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
无论优先级如何,两个软件包之一的结果可能不正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.