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

Posted

技术标签:

【中文标题】在 R 中,如何确定用户定义的中缀运算符的运算符优先级?【英文标题】:In R, how can I determine the operator precedence of user defined infix operators? 【发布时间】:2015-09-11 17:42:32 【问题描述】:

假设我在 R 中有两个自定义中缀运算符:%foo%%bar%

我有同时使用这两种运算符的表达式,例如:

x %foo% y %bar% z

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

如何更改优先级,例如,%bar% 始终在 %foo% 之前执行?在上面的示例中,这将与以下内容相同:

x %foo% (y %bar% z)

【问题讨论】:

【参考方案1】:

如何确定 %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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在 R 中,如何确定用户定义的中缀运算符的运算符优先级?的主要内容,如果未能解决你的问题,请参考以下文章

前缀中缀后缀表达式

中缀表达式如何转换为前后缀表达式?

中缀表达式实现简单计算器

如何在程序中将中缀表达式转换为后缀表达式

2017-2018-2 20172314 『Java程序设计』课程 结对编程练习_四则运算

将中缀表达式转换为后缀表达式