在for循环中生成markdown注释

时间:2013-06-18 20:58:55

标签: r markdown knitr roxygen

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

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

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

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

但是,Rmd文件如下所示。

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

R块中的markdown注释不会编译为HTML。有可能吗?

谢谢, 彼得

3 个答案:

答案 0 :(得分:10)

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

#+ 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脚本并且您旋转(“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

答案 1 :(得分:6)

一个对我有用的解决方案由how to create a loop that includes both a code chunk and text with knitr in R提供。在每个循环结束时使用两者 <?php namespace App; use Auth; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'username', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function getAvatarUrl() { return "http://www.gravatar.com/avatar/" . md5(strtolower(trim($this->email))) . "?d=mm&s=40"; } public function scopeUserr($query) { return $query->where('username',Auth::user()->id); } } results='asis'前面的两个空格。

示例:

没有两个空格

\n

输出(html):

enter image description here

正如您所看到的,评论和标题混杂在一起

<强>解决方案: 在循环结束处有两个空格```{r, results='asis'} headers <- list("We","are","your","friends") for (i in headers){ cat("\n##H ", i, " \n") cat("comment",i) }

cat("  \n")

enter image description here

注意:for (i in headers){ cat("\n##H ", i, "\n") cat("comment",i) cat(" \n")# <--------------------------------- } 需要在最后,即使你在循环中绘制或计算它,它也不起作用。

答案 2 :(得分:5)

我已经(重新)在我的pander包中基于knitr独立于@Yihui实现了brew的一些功能,如果你不这样做,这可以帮助解决这些(和类似的)问题想在brew之前运行knit。快速演示:

> 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参数的麻烦设置),并且你也可以使用{{1例如,标签条件(如显示或不显示报告的一部分)。最重要的是:<% ... %>(未处理的R命令)和<% ... %>(结果由<%= ... %>处理)标记之间存在巨大差异。后者意味着所有返回的R对象都转换为Pandoc的降价,例如:

pander