knitr中的R针对看起来像块标签的注释感到困惑

时间:2013-08-31 03:00:20

标签: r knitr

我正在使用R中knitr包中的stitch函数为我的学生创建R代码的html文件。

  

我有几百个R脚本,我正在自动创建html页面。

但是,如果我的R脚本包含注释行,例如

  

## ------示例------

然后缝合函数thinks这是代码块的标签,并且经常删除我脚本的其他部分。

turn off函数中的stitch() 分块是否可以传递所有代码as is? 我查看了stitch()read_chunk()的内部代码,似乎无法知道## ----- Example -----何时是一个块标签。

这是最小的工作示例:R 3.0.1; knitr 1.4.1

# Test out problem with stitch in knitr

my.code <- "# This a sample of R code
x <- 1:10
print(x)
plot(x,x)

## ---------------- Example  -----
# Notice that only this part of the code appears in the html file.
x <- 10:30
print(x)
plot(x,x)

NULL
"

writeLines(my.code, con='R.code')

library(knitr)
stitch("R.code", system.file("misc", "knitr-template.Rhtml", package = "knitr"))

2 个答案:

答案 0 :(得分:5)

这是knitr 1.3中的新功能introduced:使用# ----时,read_chunk()将被视为块标头的标记。

如果您不想使用此功能,则可以在#之后使用少于4个短划线,例如

## --- Example ----
## -- Example ----
## Example ----

我假设您为了RStudio代码部分而有这样的评论,这需要在部分标题的末尾至少有四个破折号。

然后您需要开发版knitr v1.4.6 on Github来完全解决此问题。

答案 1 :(得分:2)

可能的解决方法是预处理文件并更改字符,以便stitch不会尝试解释这些行:

以下代码:

require(gsubfn)

tmp <- readLines('example1.R')

gsubfn("(-+)( *Example *)(-+)", function(one,two,three) {
    paste0( paste( rep('=', nchar(one)), collapse='' ),
        two,
        paste( rep('=', nchar(three)), collapse='' ) ) },
    tmp)

writeLines(tmp, 'example1.R')

将在文件“example1.R”中读取并替换多个“ - ”后跟“示例”的任何实例,后跟更多“ - ”(在示例之前和之后使用可选空格),并使用“=”代替“ - “(相同的数字)并将结果写回同一个文件。您可以更改正则表达式以捕获不同的注释,或更改要用其他字符替换的函数。如果您不想覆盖原始文件名(可能更安全),可以保存为其他文件名。并且您可以将上述所有内容包装在一个函数中并循环遍历文件夹中的所有文件以修改所有这些文件。然后,对结果运行stitch应该只留下评论。