繁体   English   中英

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

[英]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.

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