我有几个数据集,每个数据集都有一个共同的分组因子。我想为每个分组因子生成一个包含单独部分的大型报告。因此,我想为分组因子的每次迭代重新运行一组rmarkdown
代码。
使用here中的以下方法对我无效。即:
---
title: "Untitled"
author: "Author"
output: html_document
---
```{r, results='asis'}
for (i in 1:2){
cat('\n')
cat("#This is a heading for ", i, "\n")
hist(cars[,i])
cat('\n')
}
```
因为我想在每个分组因子上运行的降价不容易适合一个代码块。报告必须按分组因子排序,我希望能够在分组因子的每次迭代中进出代码块。
因此,我使用Rscript中的循环调用Rmd.
来渲染每个分组因子here:
# run a markdown file to summarise each one.
for(each_group in the_groups){
render("/Users/path/xx.Rmd",
output_format = "pdf_document",
output_file = paste0(each_group,"_report_", Sys.Date(),".pdf"),
output_dir = "/Users/path/folder")
}
我的计划是将各个报告与pdftk
合并。但是,当我进入大约第5次迭代时,我的Rstudio会话挂起并最终以致命错误中止。我已单独运行Rmd.
,因为它停止的分组因子工作正常。
我使用以下简单的测试文件测试了一些循环:
.R
# load packages
library(knitr)
library(markdown)
library(rmarkdown)
# use first 5 rows of mtcars as example data
mtcars <- mtcars[1:5,]
# for each type of car in the data create a report
# these reports are saved in output_dir with the name specified by output_file
for (car in rep(unique(rownames(mtcars)), 100)){
# for pdf reports
rmarkdown::render(input = "/Users/xx/Desktop/2.Rmd",
output_format = "pdf_document",
output_file = paste("test_report_", car, Sys.Date(), ".pdf", sep=''),
output_dir = "/Users/xx/Desktop")
}
.Rmd
```{r, include = FALSE}
# packages
library(knitr)
library(markdown)
library(rmarkdown)
library(tidyr)
library(dplyr)
library(ggplot2)
```
```{r}
# limit data to car name that is currently specified by the loop
cars <- mtcars[rownames(mtcars)==car,]
# create example data for each car
x <- sample(1:10, 1)
cars <- do.call("rbind", replicate(x, cars, simplify = FALSE))
# create hypotheical lat and lon for each row in cars
cars$lat <- sapply(rownames(cars), function(x) round(runif(1, 30, 46), 3))
cars$lon <- sapply(rownames(cars), function(x) round(runif(1, -115, -80),3))
cars
```
Today is `r Sys.Date()`.
```{r}
# data table of cars sold
table <- xtable(cars[,c(1:2, 12:13)])
print(table, type="latex", comment = FALSE)
```
这很好用。所以我在Rmd.
上运行我的实际循环时也看到了内存压力,这个循环非常高。
Rmd.
文件的渲染时,有没有办法减少内存?Rmd.
文件的渲染调用,这不依赖于整个循环位于一个代码块内?答案 0 :(得分:1)
在rmarkdown::render() in a loop - cannot allocate vector of size
处找到了解决方案knitr :: knit_meta(class = NULL,clean = TRUE)
在渲染行之前使用此行,看来可行
答案 1 :(得分:0)
我现在正在处理同样的问题,而且非常令人困惑。我试图创建一些简单的MWE,但它们偶尔成功循环。到目前为止,我已经尝试了
这是我的问题:
我们如何调试挂起?我们应该设置特殊的日志文件来了解出了什么问题吗?