我正在尝试将一个非常关键的数据库接口脚本转换为R markdown以用于文档目的,其目的是纠缠该文件以生成进入我的crontab的R代码。然而我发现如果我设置eval=T
然后编织文件会运行代码(我不想意外地发生)并且如果我设置eval=F
那么纠缠文件会产生所有注释代码。
是否有一种安全的方法来生成一个文件,该文件可以纠缠于可运行的代码而不会冒执行风险?我想我每次都能找到/替换eval=F
,但这似乎不够优雅。
答案 0 :(得分:4)
我认为你可以通过编写一个chunk hook函数来实现这一点。有关示例,请参阅knitr::hook_purl
的源代码。这是一个快速而肮脏的解决方案:
library(knitr)
knit_hooks$set(purl = function(before, options) {
if (before) return()
input = current_input() # filename of input document
output = paste(tools::file_path_sans_ext(input), 'R', sep = '.')
if (knitr:::isFALSE(knitr:::.knitEnv$tangle.start)) {
assign('tangle.start', TRUE, knitr:::.knitEnv)
unlink(output)
}
cat(options$code, file = output, sep = '\n', append = TRUE)
})
如果在文档中设置此块挂钩,则无论块选项eval = TRUE
还是FALSE
,都将写出所有代码块。请注意,您必须将其放在文档的第一个代码块中。
如果您的输入文档具有简单的结构(例如,没有交叉块引用),则有一种更简单的方法:您可以通过knitr:::knit_code$get()
获取所有代码块,而您需要做的就是全部写入他们是R剧本。
答案 1 :(得分:1)
几年后再次回顾这个问题,
您可以将代码块参数eval=FALSE, comment=NA
组合为:
knit()
时避免运行代码块,并且purl()
时打印无注释的代码此参数在页面https://yihui.org/knitr/options/的“代码修饰”部分中进行了描述。
也许这已经在其他地方的其他文章中进行了描述,但是我只是花了小时试图找出如何用“钩子”和knitr
源代码来做到这一点,然后再找到答案我知道一定在那里。希望这对下一个人来说更容易!