r-使用RMarkdown生成Word文档,其中包含程序生成的、交错的、标题和图形



背景:使用Purrr过滤数据集,并使用ggplot(在RMarkdown中,用于Shiny(绘制一系列图形

在解决了上面的上一个问题之后,我现在有了一个.Rmd文件,该文件将生成一个Word文档,其中包含节标题、图表和目录。

以下问题仍然存在:

  1. 节头和图没有交错。我目前拥有的是:

头1

头2

头3

图1

图2

图3

应该如何修改我的代码以生成:

头1

图1

头2

图2

头3

图3

相反?

  1. 单词document包含方括号中的数字,例如"[[1]]"[[2]]";,等等,我相信这些都是用图表打印出来的。如何移除这些?

  2. 对于每个图,我想要一个样板句,其中包括关于数据的陈述,特别是位于离平均值+/-2SD的虚线之外的数据点的数量。我试着通过包括例如来添加它

report.data %>% 
dplyr::filter(identifier == x) %>%
paste(eval("r sum(result < mean(result) - 2 * sd(result))"), " results out of bounds.") 

在函数中,但这会将图形转换为文本(!(。

一如既往,我们将非常感谢您提供的任何帮助或建议-感谢您的阅读!

生成示例数据并生成报告的脚本:

library(dplyr)
set.seed(1234)
test1.level1.analyser1 <- data.frame(
result = rnorm(25, mean = 2.5, sd = 0.2), 
test = c("test1"), 
level = c("level1"), 
sample.no = c(1:25), 
analyser = c("analyser1")
)
test1.level1.analyser2 <- data.frame(
result = rnorm(25, mean = 2.6, sd = 0.1), 
test = c("test1"), 
level = c("level1"), 
sample.no = c(1:25), 
analyser = c("analyser2")
)
test1 <- rbind(test1.level1.analyser1, test1.level1.analyser2)
test2.level1.analyser1 <- data.frame(
result = rnorm(25, mean = 10, sd = 2), 
test = c("test2"), 
level = c("level1"), 
sample.no = c(1:25), 
analyser = c("analyser1")
)
test2.level1.analyser2 <- data.frame(
result = rnorm(25, mean = 9.5, sd = 0.75), 
test = c("test2"), 
level = c("level1"), 
sample.no = c(1:25), 
analyser = c("analyser2"))
test2.level2.analyser1 <- data.frame(
result = rnorm(25, mean = 30, sd = 1.8), 
test = c("test2"), 
level = c("level2"), 
sample.no = c(1:25), 
analyser = c("analyser1")
)
test2.level2.analyser2 <- data.frame(
result = rnorm(25, mean = 25, sd = 0.75), 
test = c("test2"), 
level = c("level2"), 
sample.no = c(1:25), 
analyser = c("analyser2"))
test2.level2 <- rbind(test2.level2.analyser1, test2.level2.analyser2)
test2 <- rbind(test2.level1, test2.level2)
write.csv(test1, "test1.csv", row.names = FALSE)
write.csv(test2, "test2.csv", row.names = FALSE)
###
report.data <- rbind(test1, test2) %>% mutate(identifier = paste(test, level, sep = " ")) 
rmarkdown::render("report.Rmd", params = list(report.data = report.data), output_file = "intersite.comparison.report.doc")

报告。Rmd文件:

---
title: "Inter-site IQC Comparison Report"
output: word_document
toc: yes
---
```{r setup, include=FALSE, comment = "", results = 'asis', echo = FALSE}
library(dplyr)
library(ggplot2)
library(purrr)
knitr::opts_chunk$set(echo = FALSE)
my_plot <- function(df) {
ggplot(df, aes(x = sample.no, y = result)) +
geom_point(aes(colour = analyser)) +
geom_hline(aes(yintercept = mean(result) + 2 * sd(result)), colour = "red", linetype = "dashed") +
geom_hline(aes(yintercept = mean(result) - 2 * sd(result)), colour = "red", linetype = "dashed") +
theme_classic() +
theme(legend.title = element_blank()) +
labs(
# the title above the plot, based on information in the filtered df
title = paste0("Inter-site comparison for ", unique(df$identifier)),
x = "Sample number",
y = "Result",
# the text below, based on data in the filtered data frame
caption = paste0("Caption here.")) +
expand_limits(y = 0) +
coord_cartesian(xlim = c(0, max(df$sample.no) + 2)) +    
theme(
# configure the caption / sentence below
plot.caption=element_text(size=12, hjust = 0, margin = margin(t=20)),
# add some buffer at bottom as spacing between plots
plot.margin = margin(b=50)
)
}
```
```{r, comment = "", results = 'asis', echo = FALSE}
purrr::map(unique(report.data$identifier),
function(x) {
#section heading
cat("#", (x), "n")
# filter data before passing it to the plot function
report.data %>% 
dplyr::filter(identifier == x) %>%
my_plot()
#report.data %>% 
#dplyr::filter(identifier == x) %>%
#paste(eval("r sum(result < mean(result) - 2 * sd(result))"), " results out of bounds.")
}
)
```

编辑:地图函数的当前版本代码,遵循Sean van der Merwe的善意建议,如下:

purrr::map(unique(report.data$identifier),
function(x) {
#section heading
cat("#", (x), "n")
cat("nn")
# filter data before passing it to the plot function
report.data %>% 
dplyr::filter(identifier == x) %>%
my_plot() %>% print()
cat("nn")
#report.data %>% 
#dplyr::filter(identifier == x) %>%
#paste(eval("r sum(result < mean(result) - 2 * sd(result))"), " results out of bounds.")
}
) -> results

编辑:

也许可以试试myplot() %>% print()。您需要实际使用ggplot2将绘图发送到输出。

很抱歉没有早点看到,这才是真正的关键:这些图之所以最后出现,是因为它们是map函数的输出,所以它们被map存储,并在所有处理后作为一个组输出。

原创想法:

我经常以类似的方式交错结果。我相信你的问题可能与没有足够的"n"s有关。在正常编写markdown时,您会在段落之间留出一行空白,因此在这里,您以编程方式生成的markdown必须具有"nn",以指示当前行的末尾和下面的空白行。这也适用于绘图之后和结果之后。

最新更新