在小插图构建

时间:2016-04-28 14:20:04

标签: r parsing knitr

目标

目标是创建一个解析R脚本并列出函数的包(来自包 - 如mvbutils - 但也包括导入)。

功能

main函数依赖于解析R脚本 d<-getParseData(x = parse(text = deparse(x)))

可重现的代码

例如在交互式R会话中输出

 x<-test<-function(x){x+1}
 d<-getParseData(x = parse(text = deparse(x)))

前几行:

   line1 col1 line2 col2 id parent          token terminal     text
23     1    1     4    1 23      0           expr    FALSE         
1      1    1     1    8  1     23       FUNCTION     TRUE function
2      1   10     1   10  2     23            '('     TRUE        (
3      1   11     1   11  3     23 SYMBOL_FORMALS     TRUE        x
4      1   12     1   12  4     23            ')'     TRUE        )   

错误

当构建一个含有knitr的插图 - 包含来自RStudio的knit html或devtools::build_vignettes时,前一代码块的输出为NULL。另一方面使用&#34; knitr :: knit&#34;在R会话中将给出正确的输出。

的问题:

解析器是否有理由在knit函数/环境中表现不同,有没有办法绕过它?

更新

将代码更改为:

x<-test<-function(x){x+1}
d<-getParseData(x = parse(text = deparse(x),keep.source = TRUE))

解决了这个问题,但这并没有回答为什么同一个函数的行为方式不同的问题。

1 个答案:

答案 0 :(得分:1)

从帮助页面?options

  

keep.source:

     

TRUE时,函数的源代码(新定义或加载)存储在内部,允许将注释保存在正确的位置。通过打印或使用deparse(fn, control = "useSource")来检索来源。

     

默认值为interactive(),即TRUE,供交互使用。

构建插图时,您正在运行非交互式R会话,因此源代码将在parse()中被丢弃。

parse(file = "", n = NULL, text = NULL, prompt = "?",
      keep.source = getOption("keep.source"), srcfile,
      encoding = "unknown")