循环中RMarkdown报告无法嵌入表格的问题求助
问题解决方案
核心问题排查
- 未定义变量:
id.tempo <- unique(unique(df$Periodo))中的df未定义,需改为df_trats - 条件分支语法错误:
else未用大括号包裹,导致render仅在选择quasibinomial模型时执行,且部分逻辑脱离条件判断 - Rmd未调用参数:
.Rmd文件未添加输出params$res1的代码,参数传递后未被展示 - 文件覆盖问题:循环中每次生成的PDF文件名相同,后续周期的结果会覆盖之前的
- 参数默认值错误:
.Rmd中params的res1默认值设为res1(字符串),应设为NULL
修正后的R脚本
# Packages library(tidyverse) library(hnp) library(multcomp) library(rmarkdown) # Open data set df_trats <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/data.csv",sep=";") df_trats$Tratamento <- as.factor(df_trats$Tratamento) names_trat <- unique(df_trats$Tratamento) # Loop for each Periodo variable id.tempo <- unique(df_trats$Periodo) # 修复df未定义问题 for(i in 1:length(id.tempo)){ current_period <- id.tempo[i] cat("Período de tempo analisado:", current_period, "\n") df.subset <- df_trats %>% dplyr::filter(Periodo == current_period) df.subset$Tratamento <- as.factor(df.subset$Tratamento) # Models model1 <- glm(Evento~Tratamento, family="binomial", data=df.subset) model2 <- glm(Evento~Tratamento, family="quasibinomial", data=df.subset) B <- hnp::hnp(model1, print.on = TRUE, plot=FALSE) qB <- hnp::hnp(model2, print.on = TRUE, plot=FALSE) pB <- B$out/B$total pqB <- qB$out/qB$total tvalues <- as.data.frame(rbind(pB=pB, pqB=pqB)) choose.model <- rownames(tvalues %>% filter(V1 == min(V1))) # Anova if(pB == choose.model){ anova.df.B <- anova(model1, test="Chisq") print(anova.df.B) } else { # 修复else语法,添加大括号 anova.df.qB <- anova(model2, test="F") print(anova.df.qB) } # Pairwise comparisions if(pB == choose.model){ cat("Medias dos tratamentos\n") medias <- df.subset %>% dplyr::group_by(Tratamento) %>% dplyr::summarize(Mortalidade=mean(Evento)*100, EP = (stats::sd(Evento)/sqrt(n()-1))*100) Comparacoes <- summary(glht(model1, linfct=mcp(Tratamento="Tukey"))) Comparacoes_up <- summary(Comparacoes, test = univariate()) medias.lcd <- cld(Comparacoes_up, level=0.05, Letters= c(LETTERS, letters), decreasing=TRUE) medias.F <- cbind(medias, as.vector(medias.lcd$mcletters$Letters)) colnames(medias.F) <- c("Tratamento","Mortalidade","EP","Índice") print(medias.F) } else { # 修复else语法,添加大括号 cat("Medias dos tratamentos\n") medias <- df.subset %>% dplyr::group_by(Tratamento) %>% dplyr::summarize(Mortalidade=mean(Evento)*100, EP = (stats::sd(Evento)/sqrt(n()-1))*100) Comparacoes <- summary(glht(model2, linfct=mcp(Tratamento="Tukey"))) Comparacoes_up <- summary(Comparacoes, test = univariate()) medias.lcd <- cld(Comparacoes_up, level=0.05, Letters= c(LETTERS, letters), decreasing=TRUE) medias.F <- cbind(medias, as.vector(medias.lcd$mcletters$Letters)) colnames(medias.F) <- c("Tratamento","Mortalidade","EP","Índice") print(medias.F) } # 传递参数并生成带周期标识的PDF,避免覆盖 params <- list(res1 = medias.F, period = current_period, trat_names = names_trat) rmarkdown::render("test.Rmd", params = params, output_file = paste0("test_periodo_", current_period, ".pdf"), envir = new.env()) }
修正后的test.Rmd
--- title: "Relatório dos tratamentos: `r params$trat_names`" author: "Vittia" date: "`r Sys.Date()`" params: res1: NULL period: NULL trat_names: NULL output: pdf_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE) library(knitr)
Período: r params$period
Tabela de Resultados
kable(params$res1, caption = "Mortalidade por Tratamento", align = "c")
## 关键说明 - 修复了`if/else`的语法错误,确保两个模型分支都能执行报告生成 - 修改PDF输出文件名,按周期命名避免文件覆盖 - 在Rmd中添加`kable()`来格式化输出表格,确保参数传递后能正确显示 - 修正了未定义的`df`变量问题 - 优化参数传递,增加周期和处理名称的参数,让报告信息更完整 内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

