r - R中函数调用的优先级

标签 r operator-precedence function-calls

operator precedence的标准R帮助页面上,它们不包括函数调用,在我看来,这似乎很草率。这给我带来了一些问题,所以我决定只对substitute使用试错法,发现优先级似乎在[[^之间:

> substitute(a^b())[[1]]
`^`
> substitute(a[b]())[[1]]
a[b]

以中缀表示法,它们将是(^ a (b ()))(([ a b) ())(将调用运算符表示为())。用简单的英语来说,第一个示例显示了对参数ab()调用了指数函数,而在第二个示例中,最终结果是对函数a[b]的调用。

这种优先级在每种情况下都适用吗?函数调用的优先级不是恒定的,这似乎很奇怪,但是如果它确实是恒定的,则不会被包含在上述帮助页面中,这是没有道理的。

最佳答案

函数调用的优先级是常量

R非常像Lisp,在引擎盖下。

It has SEXPslisp; SEXP是一个元组(列表),其中元组的第一个元素([[1]])是运算符,其余元素(通常本身就是其他SEXP)是运算符的参数。

当你写

paste("a",1 + 2)

R明白
(`paste`,"a",(`+`, 1, 2))

当您运行替代程序时,您将获得SEXP(尽管它们的外观像R代码一样漂亮),并且(最外层)SEXP的第一个元素是将在表达式中应用的最后一个运算符-即最低优先级。

如您所知,您可以使用以下方式查看表达式的各个部分:
> str(as.list(quote(a^b())))
List of 3
 $ : symbol ^
 $ : symbol a
 $ : language b()

在您的示例中将此理解应用于优先级。
a^b()的最后一个运算符是什么?

让我们逐步考虑
  • 替代并评估a
  • 替代并评估b
  • 评估(步骤结果)不带参数的2(称为调用)
  • 替代并评估^
  • 使用参数41
  • 评估3
    所以最后一个运算符是名为^的值

    接下来,a[b]()的最后一个运算符是什么?
  • 替代并评估a
  • 替代并评估b
  • 替代并评估[
  • 用参数(步骤结果)3和(步骤结果)1
  • 评估(步骤结果)2
  • 评估(步骤结果)4

  • 在这种情况下(步骤的结果),4具有方便的名称a[b]

    因此,最后一个运算符是对a[b]的调用(不带参数的求值)。

    编辑:警告

    我在这里简化了实际情况,因为由于R的特殊性,函数参数作为未评估的(环境,表达式)对传递给函数(运算符),而不是通过引用或值传递,而“提交”订单的顺序与上述大致相同,实际的配送顺序实际上是相反的-甚至错过了步骤。但是,您不必为此担心。

    关于r - R中函数调用的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23689211/

    相关文章:

    r - R 中文本对齐

    在 Ubuntu 上网本上运行 R 需要有关图形设备大小的帮助

    c++ - 初始化器列表 *argument* 评估顺序

    c - 运算符优先级和三元运算符

    c - NDIS筛选器驱动程序的FilterReceiveNetBufferLists处理程序未调用

    r - 打破 R 中的嵌套循环

    r - BLAS-LAPACK-ATLAS-R 安装是否具有多线程?

    operator-precedence - 控制验证注释顺序?

    递归可以命名为简单的函数调用吗?

    javascript - 如何使用 ANTLR 解析 JavaScript 函数表达式调用?