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

R 理解:`+`(1,`*`(2,3))以及如何更好地对其进行编码,r,R,这个代码是什么:`+`(1,`*`(2,3))应该在R中做什么?它能以更典型的方式编码吗?如何使用?如果使用带引号的运算符(例如,`+`或`*`),则实际使用的是具有典型函数语法的标准运算符 假设您想用这种方法计算1+2。你可以这样做: `+`(1, 2) ## Please call the sum operator using 1 and 2 as arguments. 因此,由于您发布的表达式是`+`(1,`*`(2,3)),因此它基本上是求和运算符,其参数是1,其结果是乘积运算符,其参

这个代码是什么:
`+`(1,`*`(2,3))
应该在R中做什么?它能以更典型的方式编码吗?如何使用?

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

假设您想用这种方法计算
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
    作为乘法函数的调用
  • 它的结果是1之外的第二个参数

这显示了如何使用“[”和“[[”操作符拉出树的分支,开始跟随该“函数”表达式的解析树。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
您可以恢复中缀符号:

> 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
>quote(`+`(1,`*`(2,3))[c(1,2,3)]
1 + 2 * 3
>z[1:长度(z)]
1 + 2 * 3

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


如果你想读更多的话,这里有一些很好的信息。

应该是这样吗"我们首先有
2*3
?是的,会修正的。谢谢。它不是真正的波兰符号,因为每个函数的参数列表都有括号分隔。@HenningMakholm,好的,修改过的波兰符号。括号是特定的R,它是函数语法。这是相同的基本思想,与我认为的问题非常相关。H太有意思了。在Haskell中,你在函数周围使用`使其成为中缀运算符!