这段代码
`+`(1, `*`(2, 3))
在R语言中的作用是什么?是否可以用更常见的方式编写?如何实现?如果您在引号中使用运算符(例如 `+`
或 `*`
),则实际上是使用具有典型 function
语法的标准运算符。
假设您想使用这种方式计算 1 + 2
。您可以这样做:
`+`(1, 2) ## Please call the sum operator using 1 and 2 as arguments.
所以,由于您发布的表达式是`+`(1, `*`(2, 3))
,它基本上是一个求和运算符,其参数为1
和乘法运算符的结果,其参数为2
和3
。
最终,一种典型的方法是1 + (2 * 3)
。
显然,这是特定于 R 的,但许多其他编程语言也使用它。正确的术语实际上是波兰表示法,它是一种在不需要括号的情况下明确定义顺序的方法,这对于解析器/解释器非常有用。
如果您想阅读更多信息,可以在这里找到一些很好的信息。
1 + 2 * 3
从内向外执行的过程:
2 * 3
2 * 3
吗?” - tospig以下是如何使用 "[" 和 "[[" 操作符来提取树的分支,从而开始跟踪该“函数式”表达式的解析树。在R中,表达式存储在列表中:
> 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