R Markdown生成Qualtrics调研单用户PDF报告格式问题咨询
Qualtrics问卷用户个性化PDF报告问题修复方案
先修复循环代码的小问题
你现有循环里存在两个可优化点:
- for循环自带迭代逻辑,不需要手动写
i <- i + 1 - 文件名拼接重复使用了
name2,应该是name1+name2的组合
修改后的循环代码如下:
# 提前提取列映射表,避免循环内重复计算 col_map <- attr(df, "column_map") %>% select(qname, description) for(i in 1:nrow(df)){ user_data <- slice(df, i) rmarkdown::render( input = 'test.Rmd', output_file = paste0(user_data$name2, "_", user_data$name1, "_", user_data$yob, "_", user_data$StartDate, '.pdf'), # 通过params传递参数,避免全局变量冲突 params = list( user_data = user_data, col_map = col_map ) ) }
再修改test.Rmd文件解决两个核心问题
修改后的完整test.Rmd内容如下,核心逻辑是:
- 将单行用户数据从宽表转成长表,实现纵向展示
- 关联列映射表替换列名为实际问题标签
--- header-includes: - \usepackage{booktabs} - \usepackage{longtable} - \usepackage{array} - \usepackage{multirow} - \usepackage{wrapfig} - \usepackage{float} - \usepackage{colortbl} - \usepackage{pdflscape} - \usepackage{tabu} - \usepackage{threeparttable} - \usepackage{threeparttablex} - \usepackage[normalem]{ulem} - \usepackage{makecell} - \usepackage{xcolor} # 新增参数接收入口 params: user_data: NULL col_map: NULL title: "Pacjent: `r params$user_data$name1` `r params$user_data$name2`" author: "YOB: `r params$user_data$yob`; e-mail: `r params$user_data$mail`" date: "date: `r params$user_data$StartDate`" output: pdf_document: toc: false editor_options: chunk_output_type: console --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo =FALSE, warning = FALSE, message = FALSE)
library(kableExtra) library(tidyverse)
# 宽表转长表,实现纵向展示 data_long <- params$user_data %>% pivot_longer(everything(), names_to = "qname", values_to = "回答") %>% # 关联问题标签替换列名 left_join(params$col_map, by = "qname") %>% select(问题 = description, 回答) %>% # 可选:过滤空回答,让报告更整洁 filter(!is.na(回答))
kbl(data_long, longtable = T, booktabs = T) %>% kable_styling(latex_options = c("repeat_header", "striped"), full_width = T) %>% column_spec(1, width = "15em") %>% column_spec(2, width = "25em")
## 可选优化 如果需要隐藏问卷系统自带的元字段(如IP地址、ResponseId等),可以在`data_long`处理步骤中添加过滤逻辑,比如: ```r data_long <- params$user_data %>% pivot_longer(everything(), names_to = "qname", values_to = "回答") %>% left_join(params$col_map, by = "qname") %>% select(qname, 问题 = description, 回答) %>% # 过滤不需要展示的字段 filter(!qname %in% c("IPAddress", "ResponseId", "RecipientLastName", "Status")) %>% select(-qname) %>% filter(!is.na(回答))
内容的提问来源于stack exchange,提问作者blazej
相关产品推荐
相关产品推荐

