You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环中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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:16:38