2013-06-11 36 views
4

在R中,我注意到function运算符的分析树似乎是多余的,因为它的第四个元素看起来总是由前三个元素组成。R中函数分析树的冗余

例如,

> 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} 
+2

好问题;我在R语言定义中找不到任何东西,但我认为保留源参考正是关于能够保留(例如)评论;如果我做了< - 替代(函数(x = 1){## a comment; x^2})'(用分号划线),那么'str(s [[4]])这是一个'srcref'对象。 'srcref'类的方法看起来真的很神秘......(文档:http://stat.ethz.ch/R-manual/R-patched/library/base/html/srcfile.html) –

+0

另一个有趣的事情是在第四个元素上执行'as.list',虽然我不知道结果列表代表什么。 –

+1

@ Ben的权利。要确认第四个元素真的只是一个srcref,请参阅您在执行操作时获得的内容:'options(keep.source = FALSE); as.list(替代(函数(x = 1){x^2}))'。 (或者只检查第四个元素的类!) –

回答

4

显然这个组件是源参考:它不容易地处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可能会给出最好的解释。

1

一些附加注释:

1)这是可能的禁止使用的options(keep.source=FALSE)(默认此功能TRUE):

> as.list(substitute(function(x = 1){x^2})) 
[[1]] 
`function` 

[[2]] 
[[2]]$x 
[1] 1 


[[3]] 
{ 
    x^2 
} 

[[4]] 
NULL 

在这种list,第一元件是一个标识符号关闭对象,第二个保存formals,第三个保存body。请注意,最后一个是以“标准”方式打印的。输入的第四个元素将保存输入文本。 2)如果在控制台输入function(x = 1){x^2},则R调用print.function,它接受useSource参数。这是默认的TRUE,并且导致R简单地重复存储在解析列表的第四个元素中的内容。将其设置为FALSE强制R打印该功能body

> options(keep.source=TRUE) 
> f <- function(x = 1){x^2} 
> f 
function(x = 1){x^2} 
> print.function(f) 
function(x = 1){x^2} 
> print.function(f, useSource=FALSE) 
function (x = 1) 
{ 
    x^2 
}