在 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 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

How can I determine the operator precedence of %foo% and %bar%?

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

此限制的一个原因是实施和维护一组中缀运算符的优先规则将极其困难和限制。想象一下,您加载了一个带有一些自定义中缀运算符的 R 包。然后需要定义包中的中缀运算符与您创建的 %foo%%bar% 的关系。这将很快成为一个沉重的负担。

例如,假设包一包含中缀运算符 %P1IF%,包二包含中缀运算符 %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

无论优先级如何,两个包之一的结果可能不正确。