Knitr和纠结代码没有执行

时间:2014-09-25 21:50:40

标签: r knitr

我正在尝试将一个非常关键的数据库接口脚本转换为R markdown以用于文档目的,其目的是纠缠该文件以生成进入我的crontab的R代码。然而我发现如果我设置eval=T然后编织文件会运行代码(我不想意外地发生)并且如果我设置eval=F那么纠缠文件会产生所有注释代码。

是否有一种安全的方法来生成一个文件,该文件可以纠缠于可运行的代码而不会冒执行风险?我想我每次都能找到/替换eval=F,但这似乎不够优雅。

2 个答案:

答案 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组合为:

  1. 在运行knit()时避免运行代码块,并且
  2. 在运行purl()时打印无注释的代码

此参数在页面https://yihui.org/knitr/options/的“代码修饰”部分中进行了描述。

也许这已经在其他地方的其他文章中进行了描述,但是我只是花了小时试图找出如何用“钩子”和knitr源代码来做到这一点,然后再找到答案我知道一定在那里。希望这对下一个人来说更容易!