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

13
这段代码 `+`(1, `*`(2, 3)) 在R语言中的作用是什么?是否可以用更常见的方式编写?如何实现?
4个回答

24

如果您在引号中使用运算符(例如 `+``*`),则实际上是使用具有典型 function 语法的标准运算符。

假设您想使用这种方式计算 1 + 2。您可以这样做:

`+`(1, 2) ## Please call the sum operator using 1 and 2 as arguments.

所以,由于您发布的表达式是`+`(1, `*`(2, 3)),它基本上是一个求和运算符,其参数为1和乘法运算符的结果,其参数为23

最终,一种典型的方法是1 + (2 * 3)


多有趣啊!在 Haskell 中,你可以使用 ` 符号将一个函数转换为中缀运算符! - Luka Horvat

16

显然,这是特定于 R 的,但许多其他编程语言也使用它。正确的术语实际上是波兰表示法,它是一种在不需要括号的情况下明确定义顺序的方法,这对于解析器/解释器非常有用。

如果您想阅读更多信息,可以在这里找到一些很好的信息。


4
如果每个函数的参数列表仍然有括号限定,那么它就不是真正的波兰式表示法。 - hmakholm left over Monica
@HenningMakholm 好的,修改了波兰式记法。括号是特定于 R 语言和其函数语法的。不过基本思想相同,而且与问题非常相关。 - Trent

10
这是在R中进行“直接”函数调用的方法。请注意,所有都是函数,即使是运算符也是如此。更详细的信息请参见R语言手册第3节“表达式的评估”
简而言之,您所看到的是1 + 2 * 3从内向外执行的过程:
  • 首先调用乘法函数2 * 3
  • 其结果作为第二个参数添加到1中。

这应该是“我们首先有2 * 3吗?” - tospig
好的,会修复。谢谢。 - Dirk Eddelbuettel

9

以下是如何使用 "[" 和 "[[" 操作符来提取树的分支,从而开始跟踪该“函数式”表达式的解析树。在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

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