使用外部代码文件的Tangling knitr文件

时间:2014-02-01 02:51:52

标签: r knitr coderef

当我有:

时,有没有办法在纠结文件中包含externaL代码
<<xref>>=
@

(此处xref是对外部文件中代码的引用)

<<internal-ref>>=
<<xref>>
@

或者我是否需要获取外部文件并以某种方式工作?

在包中包含knitr晕影时,这是一个问题。在最后阶段 检查小插图,R尝试获取纠结的文件。缺少代码导致 问题!

我正在使用knitr 1.5版。

2 个答案:

答案 0 :(得分:1)

purl()的原始设计在许多方面存在缺陷。例如,它不使用<<>>来尊重交叉引用。我真的不认为R CMD build/check应该纠结这些小插曲,因为编织已经运行了一次代码。也就是说,您可以尝试latest development version,其中我引入了一个新功能hook_purl(),它应该更好地作为纠结实用程序。要启用它,请使用

knit_hooks$set(purl = hook_purl)

然后在编织时间内完成纠缠,这意味着执行的任何内容都写入R脚本。这可以保证纠结的R脚本确实包含执行的代码。您只需要调用knit()一次即可获得输出文档和R脚本。

答案 1 :(得分:0)

我也使用 knitr 版本1.5,你提供的第二个选项对我来说很好。

此处,文档中唯一的R代码存储在"child.Rnw"中已命名的未评估块中:

<<xref, eval=FALSE, echo=FALSE, results="hide">>=
d <- 1:10
d
@

该文件及其块通过使用"main.Rnw"选项的初始块读入主文件child="filename"。第二个块评估代码:

\documentclass{article}
\begin{document}

<<child, child="child.Rnw", eval=TRUE>>=
@

<<internal-ref, eval=TRUE>>=
<<xref>>
@

\end{document}

编织得很好,更重要的是,执行purl("main.Rnw")会产生包含所有R代码的纠结文件"main.R""main.R"看起来像这样:

## ----child, child="child.Rnw", eval=TRUE---------------------------------

## ----xref, eval=FALSE, echo=FALSE, results="hide"------------------------
## d <- 1:10
## d


## ----internal-ref, eval=TRUE---------------------------------------------
d <- 1:10
d

我没有尝试将其作为插图运行,但由于它没有遗漏任何源代码,它看起来至少应该解决你的近端问题......