我认为这可能是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报告此事,看看他们是否对此有所说明。