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

Joe*_*ith 13 r

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

nik*_*par 24

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

假设你想1 + 2用这种方式计算.你可以这样做:

`+`(1, 2) ## Please call the sum operator using 1 and 2 as arguments.
Run Code Online (Sandbox Code Playgroud)

所以,既然你发布的表达式是`+`(1, `*`(2, 3)),它基本上是sum运算符,参数是1和产品运算符的结果,参数是23.

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


Tre*_*ent 16

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

如果你想阅读更多内容,这里有一些很好的信息.

  • 当仍有括号分隔每个函数的参数列表时,它不是波兰表示法. (4认同)

Dir*_*tel 10

这是在R中调用的"简单"函数.回想一切都是函数,甚至是运算符.有关详细信息,请参阅R语言手册,第3节"表达式评估".

简而言之,你在这里所拥有的是1 + 2 * 3从内到外:

  • 我们首先2 * 3调用乘法函数
  • 其结果是除了1之外的第二个参数.


42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)

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

> 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
Run Code Online (Sandbox Code Playgroud)

你可以恢复中缀表示法:

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

> z <- quote(`+`(1, `*`(2, 3)))
> z[1:length(z)]
1 + 2 * 3
Run Code Online (Sandbox Code Playgroud)