我正在尝试使用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。有可能吗?
谢谢, 彼得
答案 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):
正如您所看到的,评论和标题混杂在一起
<强>解决方案:强>
在循环结束处有两个空格:```{r, results='asis'}
headers <- list("We","are","your","friends")
for (i in headers){
cat("\n##H ", i, " \n")
cat("comment",i)
}
cat(" \n")
注意: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