在R中,我注意到function
运算符的语法分析树似乎是多余的,因为它的第四个元素似乎总是由前三个元素组成。
例如,
> as.list(substitute(function(x = 1){x^2}))
[[1]]
`function`
[[2]]
[[2]]$x
[1] 1
[[3]]
{
x^2
}
[[4]]
function(x = 1){x^2}
我注意到的一件事是,第四个元素确实存储了输入函数的格式。
> as.list(substitute(function(x = 1){
+ x^2})[[4]]
function(x = 1){
x^2}
解析树中第四个元素的目的是什么?我唯一能看到它被使用的情况是您是否要逐字打印功能,您可以通过打印该功能来完成此操作,例如
> f = function(x = 1){
+ x^2}
> f
function(x = 1){
x^2}
最佳答案
显然,此组件是源代码引用:它不容易位于R language definition中,但其目的恰恰是保留原始源代码的结构,尤其是注释。例如
s <- substitute(function(x=1){
## a comment
x^2})
str(s[[4]])
## Class 'srcref' atomic [1:8] 1 21 2 15 21 15 1 2
## ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x8a87634>
显示它是一个
srcref
对象。如?srcfile页面(即c(first_line, first_byte, last_line, last_byte, first_column, last_column, first_parsed, last_parsed)
)中所述,神秘数字(1、21、2、15,...)表示指向表示源代码的低级对象的索引。正如@ SimonO101指出的那样,有一个R Journal article by Duncan Murdoch可能给出了最好的解释。关于R中功能解析树的冗余,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17053765/