理解:`+`(1, `*`(2, 3)) 以及如何更好地编码

问题描述 投票:0回答:4

这段代码:

`+`(1, `*`(2, 3))
应该在 R 中做什么?可以用更典型的方式编码吗?怎么办?

r
4个回答
24
投票

这里曾经有一个答案。


16
投票

显然这是 R 特有的,但许多其他编程语言也使用它。正确的术语实际上是“波兰表示法”,它是一种无需括号即可明确确定顺序的方法,这对于解析器/解释器来说非常方便。 如果您想了解更多信息,

这里

有一些很好的信息。


10
投票
一切

都是一个函数,甚至是运算符。更完整的详细信息位于 R 语言手册第 3 节“表达式求值” 简而言之,从内到外,您所拥有的是

1 + 2 * 3


我们首先有
    2 * 3
  • ,因为乘法函数被称为
    其结果是除 1 之外的第二个参数。

9
投票

> quote(`+`(1, `*`(2, 3)))[1] `+`() > quote(`+`(1, `*`(2, 3)))[2] 1() > quote(`+`(1, `*`(2, 3)))[[2]] [1] 1 > quote(`+`(1, `*`(2, 3)))[3] (2 * 3)() > quote(`+`(1, `*`(2, 3)))[[3]] 2 * 3

请注意,它与更传统的中缀表示法是相同的解析树:

> quote(1+(2*3))[1] `+`() > quote(1+(2*3))[2] 1() > quote(1+(2*3))[3] (2 * 3)() > quote(1+(2*3))[4] NULL() > quote(1+(2*3))[3][1] (2 * 3)() > quote(1+(2*3))[3][[1]] (2 * 3) > quote(1+(2*3))[3][[1]][[1]] `(` > quote(1+(2*3))[3][[1]][[2]] 2 * 3 > quote(1+(2*3))[3][[1]][[2]][[1]] `*` > quote(1+(2*3))[3][[1]][[2]][1] `*`() > `+`(1, `*`(2, 3)) [1] 7

并且您可以恢复中缀表示法:

> quote(`+`(1, `*`(2, 3)))[c(1,2,3)] 1 + 2 * 3 > z <- quote(`+`(1, `*`(2, 3))) > z[1:length(z)] 1 + 2 * 3

© www.soinside.com 2019 - 2024. All rights reserved.