我想从数据帧的每一行生成 1 个包含子文档的 Markdown 文档,或者从数据帧生成 nrows 个 Markdown 文档。 Markdown 文档是 template.Rmd。
我认为创建一个 for 循环应该可行,但是当我尝试这样做时,by(dataFrame, 1:nrow(dataFrame), function(row) knit(file = "/Users/path/template.Rmd"))
我收到输入意外结束的错误。
Quitting from lines 23-26 (Preview-e0d353674d36.Rmd)
Error in knit(file = "/Users/path/template.Rmd") :
unused argument (file = "/Users/path/template.Rmd")
Calls: <Anonymous> ... eval -> eval -> tapply -> lapply -> FUN -> FUN -> knit
Execution halted
我尝试使用 @Yihui 解决的相同很棒的方法以编程方式引用带有 knit-expand 的文本,详细信息如下:R knit:可以以编程方式修改块标签吗?
从该解决方案中,我们有两个 .Rmd 文件:我的报告和模板
我的报告如下所示:
# My report
```{r}
data(mtcars)
cyl.levels <- unique(mtcars$cyl)
```
## Generate report for each level of cylinder variable
```{r, include=FALSE}
src <- lapply(cyl.levels, function(ncyl) knit_expand(file = "template.Rmd"))
```
`r knit(text = unlist(src))`
模板看起来像:
```{r, results='asis'}
cat("### {{ncyl}} cylinders")
```
```{r mpg-histogram-{{ncyl}}cyl}
hist(mtcars$mpg[mtcars$cyl == {{ncyl}}],
main = paste({{ncyl}}, "cylinders"))
```
```{r weight-histogam-{{ncyl}}cyl}
hist(mtcars$wt[mtcars$cyl == {{ncyl}}],
main = paste({{ncyl}}, "cylinders"))
```
该解决方案为每个圆柱级别生成一个带有子文档(标题级别为 2)的单个 Markdown 文档。但是,我正在尝试创建一个报告,该报告获取 .csv,然后创建和修改数据帧并为另一个数据帧的每一行生成内容。
我认为我所困惑的是如何使用 {{ncyl}} 中的值以编程方式引用数据库的行。我希望能够使用 {{ncyl}} 的级别来处理数据帧 mtcars 中的相关行(假设本例中只有 rows ==levels{{ncyl}} )。
While data(mtcars)
,行数确实多于圆柱体的层数,R 将 {{ncyl}} 的值存储为整数。所以,你可以打电话mtcars$gear[[{{ncyl}}]]
并获取 {{ncyl}} 行的 gear 值。
那么,为什么当我们将其添加到 template.Rmd 中时,它会失败呢?
原谅我,它不会失败,它会给我们gear <- mtcars$gear[[{{ncyl}}]]
但我们不能创建一大块齿轮,比如```{r this-gear-{{gear}}}
.
这有效
```{r}
gear <- mtcars$gear[[{{ncyl}}]]
gear
```
```{r, results='asis'}
cat("### {{ncyl}} cylinders")
```
```{r mpg-histogram-{{ncyl}}cyl}
hist(mtcars$mpg[mtcars$cyl == {{ncyl}}],
main = paste({{ncyl}}, "cylinders"))
```
```{r weight-histogam-{{ncyl}}cyl}
hist(mtcars$wt[mtcars$cyl == {{ncyl}}],
main = paste({{ncyl}}, "cylinders"))
```
这不起作用
```{r}
gear <- mtcars$gear[[{{ncyl}}]]
gear
```
```{r, results='asis'}
cat("### {{ncyl}} cylinders")
```
```{r mpg-histogram-{{ncyl}}cyl}
hist(mtcars$mpg[mtcars$cyl == {{ncyl}}],
main = paste({{ncyl}}, "cylinders"))
```
```{r weight-histogam-{{ncyl}}cyl}
hist(mtcars$wt[mtcars$cyl == {{ncyl}}],
main = paste({{ncyl}}, "cylinders"))
```
```{r {{gear}}}
gear
```
给出错误
Quitting from lines 10-12 (Preview-e0d32d687661.Rmd)
Error in eval(expr, envir, enclos) : object 'gear' not found
Calls: <Anonymous> ... knit_expand -> inline_exec -> withVisible -> eval -> eval
Execution halted
我认为我正在解决主要问题“如何为数据框的每一行创建一个降价文档?” knit-expand 功能有问题。
有人可以帮助我理解:
1、主要问题如何解决
2. 为什么 {{gear}} 在 template.Rmd 中不起作用?
所以,我仍然不明白(2),但我认为@daroczig已经让我接近理解解决主要问题的一种方法。我不认为这是一个太独特的问题,并且我认为有一种方法可以解决它而无需brew
or pander
or rapport
。无论如何,我采用了酿造方法并用数据帧的几行做了一些事情。它抛出一个错误。请注意,我没有对这段代码做任何明智的事情,只是限制mtcars
到 3 行,这样我就不会得到太多输出,然后在 for
loop.
# My report
<%
mtcars1 <- mtcars[1:3,]
mtcars1$type <- c('red','blue','green')
t.levels <- unique(mtcars1$type)
for (ty in t.levels) {
p <- subset(mtcars1,type == ty)
x <- rep(p, 4)
short <- paste0(p$gear, p$mpg)
%>
### <%= short %> blah
<%=
hist(x$mpg, main = paste(short, "blah"))
%>
<% } %>
这只是对@daroczig 下面提出的解决方案的一点蹩脚修改。只要我们命名它就可以工作demo.brew
并从调用它 Pandoc.brew('demo.brew', output = tempfile(), convert = 'html')
。举一个愚蠢的例子。
(3) 有没有一个例子说明如何在不使用brew的情况下做到这一点?我很好奇。
回答(3)是的。这适用于调用变量而不是行号的 for 循环
varlist <- unique(df$variable)
for (var in varlist) {
try(knit2html(input= '/Users/path/template.Rmd',
output=paste0('/Users/path/template',var,'.html')))
在 1:nrow() 的循环不起作用的地方起作用。