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

8
假设我在R语言中有两个自定义中缀运算符:%foo%%bar%
我有一些使用这两个运算符的表达式,例如:
x %foo% y %bar% z

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

我该如何更改优先级,使得例如 %bar% 总是在 %foo% 之前执行?在上面的例子中,这将与以下内容相同:

x %foo% (y %bar% z)
2个回答

6

我认为这不是明确记录的,但在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

4
我如何确定% foo%和% 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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接