“parse”在交互式和非交互式模式下表现不同

时间:2014-10-01 03:14:03

标签: r parsing

我认为这可能是parse中的错误,但想查看是否有其他人有更好的主意。在交互模式(RStudio)中,以下代码正常工作:

txt <- 'c("", {
  c(integer(3L), 1:3)           
  c(integer(), 1:3, 1L)         # TRUE
  c(integer(), c(1, 2, 3), 1L)  # TRUE
} )
c("", {
  lst <- list(list( 1,  2), list( 3, list( 4, list( 5, list(6, 6.1, 6.2)))))
} )
c("", {
  TRUE
} )'
saveRDS(
  attr(parse(text=txt, keep.source=TRUE), "srcfile")$parseData, 
  paste0("~/parsecomp", interactive())
)

但是如果我运行完全相同的代码(runtests.R只包含上面的代码):

R --vanilla < tests/runtests.R 

通过交互式运行原始代码而非交互式运行生成的两个rds文件应该是相同的,但是:

> non.interactive <- readRDS("~/parsecompFALSE")
> interactive <- readRDS("~/parsecompTRUE")
> length(interactive)
[1] 1280
> which(interactive != non.interactive)
[1] 1176
> interactive[which(interactive != non.interactive)]
[1] 0
> non.interactive[which(interactive != non.interactive)]
[1] 234
> identical(attributes(non.interactive), attributes(interactive))
[1] TRUE

parseData结果几乎相同(令牌,文本等),但是一个项目不同(我相信attr(parse(x), "srcFile")$parseData的值代表每个令牌的父ID)。因此,出于某种原因,在非交互模式下运行会错误地归属一个令牌的父ID。

我已经将产生错误解析的代码从数百行减少到上面。几乎任何对代码的进一步更改/简化都会导致解析差异消失。

任何人都有什么想法会导致这种情况发生?

这一切都在:

setting  value                       
version  R version 3.1.1 (2014-07-10)
system   x86_64, darwin13.1.0        
ui       RStudio (0.97.551)        

根据MrFlick的建议,这里是存储getParseData结果的输出(注意我重新使用与上面相同的变量名来存储结果):

> subset(interactive, parent != non.interactive$parent)
    line1 col1 line2 col2  id parent token terminal text
226     6    5     8    7 226      0  expr    FALSE     
> subset(interactive, parent != non.interactive$parent)
    line1 col1 line2 col2  id parent token terminal text
226     6    5     8    7 226      0  expr    FALSE     
> subset(non.interactive, parent != interactive$parent)
    line1 col1 line2 col2  id parent token terminal text
226     6    5     8    7 226    234  expr    FALSE     
> subset(non.interactive, id == 234)
    line1 col1 line2 col2  id parent token terminal text
234     9    9     9    9 234    251   ','     TRUE    ,

请注意非交互式版本的parent值如何在解析的文件中进一步向下发生(问题表达式的第9行与第6行,我认为这不可能)。


更新:我能够更简单地重新创建问题,甚至不需要非交互式版本。从干净的R会话开始,尚未完成任何操作(没有加载包等),运行:

txt <- 'c("", {
  c(integer(3L), 1:3)
  c(integer(), 1:3, 1L)         # TRUE
  c(integer(), c(1, 2, 3), 1L)  # TRUE
} )
c("", {
  lst <- list(list( 1,  2), list( 3, list( 4, list( 5, list(6, 6.1, 6.2)))))
} )
c("", {
  TRUE
} )'
prs1 <- parse(text=txt, keep.source=TRUE)
prs2 <- parse(text=txt, keep.source=TRUE)
which(attr(prs1, "srcfile")$parseData != attr(prs2, "srcfile")$parseData)

重现错误。我已向R devel报告此事,看看他们是否对此有所说明。

0 个答案:

没有答案