Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中函数解析树的冗余性_R_Parse Tree - Fatal编程技术网

R中函数解析树的冗余性

R中函数解析树的冗余性,r,parse-tree,R,Parse Tree,在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

在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}

显然,这个组件是一个源代码引用:它不容易在中找到,但它的目的正是为了保留原始源代码的结构,尤其是注释;比如说

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>
s一些附加说明:

1) 可以使用
选项(keep.source=FALSE)
(默认值为
TRUE
)禁用此功能:

在该
列表中
,第一个元素是标识闭包对象的符号,第二个元素保存
形式
,第三个元素保存
正文
。请注意,最后一个是以“标准”方式打印的。第四个元素会将输入文本保存为键入的文本

2) 如果在控制台上键入
function(x=1){x^2}
,R调用
print.function
,该函数接受
useSource
参数。默认情况下,这是
TRUE
,并使R简单地重复存储在解析列表的第四个元素中的内容。将其设置为
FALSE
将强制R打印函数
正文

> 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
}
>选项(keep.source=TRUE)
>f
函数(x=1){x^2}
>打印功能(f)
函数(x=1){x^2}
>print.function(f,useSource=FALSE)
函数(x=1)
{
x^2
}

好问题;我在R语言的定义中找不到任何东西,但我认为保留源代码引用正是为了能够保留(例如)注释;如果我做了
s,另一件有趣的事情是在第四个元素上执行
as.list
,尽管我不知道结果列表代表什么。@Ben是对的。要确认第四个元素实际上只是一个srcref,请查看执行此操作时得到的结果:
options(keep.source=FALSE);as.list(替换(函数(x=1){x^2}))
。(或者只检查第四个元素的类!)@JonClaus:as.list(s[[4]])
的结果的含义在
?srcfile
c(第一行,第一行,最后一行,最后一字节,第一列,最后一列,第一次解析,最后一次解析)
引用表示源代码的低级对象的索引。@BenBolker:您不应该将注释粘贴到回答面板中吗?
> 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
}