17

我正在尝试使用 knitr 基于具有 for 循环的 R 脚本生成 HTML 报告。我想从 for 循环中的注释生成降价注释,但我不确定是否可能。

这是一个简单的例子,这是在 test.R 中:

for (i in 1:5) {
    ## This is a heading for `i`
    #' This is a comment for `i`
    print(i)    
}

然后我使用 spin 生成一个 Rmd 文件: spin('test.R')

但是,Rmd 文件如下所示。

```{r }
for (i in 1:5) {
    ## This is a heading for `i`
    #' This is a comment for `i`
    print(i)    
}
```

R 块中的降价注释不会编译成 HTML。可能吗?

谢谢,彼得

4

3 回答 3

17

我认为您可以使用代码块选项 results='asis' 在 knitr 中获得您想要的内容,您可以在 R 脚本中的“#+”之后指定要传递给 spin 的代码(但代码看起来不如有趣的“干净” @daroczig 提出的 brew 解决方案):

#+ results='asis', echo = FALSE
for (i in 1:5) {
    cat("## This is a heading for ", i, "\n")
    cat("<!-- This is a comment for ", i, "-->\n")
    print(i)    
}

如果这是 test.R 脚本并且您执行 spin("test.R"),则生成的 md 文件将如下所示:

## This is a heading for  1 
<!-- This is a comment for  1 -->
[1] 1
## This is a heading for  2 
<!-- This is a comment for  2 -->
[1] 2
## This is a heading for  3 
<!-- This is a comment for  3 -->
[1] 3
## This is a heading for  4 
<!-- This is a comment for  4 -->
[1] 4
## This is a heading for  5 
<!-- This is a comment for  5 -->
[1] 5
于 2013-06-19T08:18:05.080 回答
9

一种对我有用的解决方案是通过如何创建一个循环来提供的,该循环包含代码块和带有 knitr 中的文本的 R。通过在每个循环的末尾使用Both results='asis'和两个空格。\n

例子:

没有两个空格

```{r, results='asis'}
headers <- list("We","are","your","friends")
for (i in headers){
  cat("\n##H ", i, "  \n")
  cat("comment",i)
}

输出(html):

在此处输入图像描述

如您所见,评论和标题混在一起

解决方案: 有两个空格cat(" \n")在循环的末尾

for (i in headers){
  cat("\n##H ", i, "\n")
  cat("comment",i)
  cat("  \n")# <---------------------------------
}

在此处输入图像描述

注意:cat(" \n")需要在最后,即使你在循环中绘制或计算它也不起作用。

于 2016-10-20T13:41:14.660 回答
6

我已经(重新)实现了一些独立于@Yihui 的功能,基于knitr我的 panderbrew包,如果您不想在ting之前运行,可以帮助解决此类(和类似)问题。快速演示:brewknit

> Pandoc.brew(text = "# Demonstrating a nice loop
+ <% for (i in 1:5) { %>
+ ## This is a header for <%=i%>
+ #' This is a comment for <%=i%>
+ <% } %>")

# Demonstrating a nice loop

## This is a header for _1_
#' This is a comment for _1_

## This is a header for _2_
#' This is a comment for _2_

## This is a header for _3_
#' This is a comment for _3_

## This is a header for _4_
#' This is a comment for _4_

## This is a header for _5_
#' This is a comment for _5_

请注意,您还可以将文件传递给Pandoc.brew(无需对text具有实际问题的参数使用这种麻烦的设置),并且您还可以将<% ... %>标签用于条件条件(例如显示或不呈现报告的一部分)。<% ... %>最重要的是:(未处理的 R 命令)和<%= ... %>(结果由pander)标签之间存在巨大差异。后者意味着所有返回的 R 对象都转换为 Pandoc 的降价,例如:

> Pandoc.brew(text = "# Demonstrating a conditional
+ <% for (i in 1:5) { %>
+ ## This is a header for <%=i%>
+ <% if (i == 3) { %>
+ Hey, that's **almost** <%=pi%>, that's between <%=3:4%>! Wanna fit a model to _celebrate_?
+ <%= lm(mpg ~ hp, mtcars) %>
+ <% }} %>")
# Demonstrating a conditional

## This is a header for _1_

## This is a header for _2_

## This is a header for _3_

Hey, that's **almost** _3.142_, that's between _3_ and _4_! Wanna fit a model to _celebrate_?

--------------------------------------------------------------
     &nbsp;        Estimate   Std. Error   t value   Pr(>|t|) 
----------------- ---------- ------------ --------- ----------
     **hp**        -0.06823    0.01012     -6.742   1.788e-07 

 **(Intercept)**     30.1       1.634       18.42   6.643e-18 
--------------------------------------------------------------

Table: Fitting linear model: mpg ~ hp

## This is a header for _4_

## This is a header for _5_
于 2013-06-18T21:45:14.517 回答