函数内Tidy eval失效:自动化生成LaTeX表格遇均值计算问题
问题分析与解决方案
原代码存在几个关键问题:
- 函数内部错误引用外部循环变量
i,函数参数为y,无法直接访问外部循环变量 - Tidy eval用法错误,处理字符型变量名时需先转换为符号再引用
stargazer参数位置错误,dep.var.caption是独立参数,不应嵌套在add.lines列表中- 代码语法不完整,
stargazer调用末尾缺少闭合括号 - 列表索引逻辑错误,初始列表未正确设置命名索引
修正后的完整代码
library(tibble) library(lfe) library(stargazer) df <- tibble::tribble(~hhid, ~treatment_arm, ~round_pooled, ~tot_lstock_count, ~tot_animal_tlu, "1020201023",1,1,10,1, "1020201023",1,11,6,0.600000023841858, "1020201036",1,1,10,0.100000001490116, "1020201036",1,11,4,0.400000005960464, "1020201039",1,1,9,0.0900000035762787, "1020201057",1,1,12,0.480000019073486, "1020201068",1,1,2,0.200000002980232, "1020201095",1,1,6,0.330000013113022, "1020201095",1,11,7,0.400000005960464, "1020201103",1,1,2,0.200000002980232, "1020201116",1,1,7,0.0599999986588955, "1020201116",1,11,2,0.0199999995529652, "1020201139",1,11,12,0.480000019073486, "1020201144",1,1,5,0.5, "1020201144",1,11,8,0.800000011920929, "1020201146",1,1,6,0.0599999986588955, "1020201146",1,11,6,0.0599999986588955, "1020201159",1,11,15,1.5, "1020201180",1,11,11,0.560000002384186, "1020201205",1,1,2,0.0199999995529652) reg_coef_tables <- function(df, y) { # 将字符型变量名转换为tidy eval可识别的符号 outcome <- sym(y) # 计算目标均值,用!!引用符号变量 mean_outcome <- df %>% filter(round_pooled == 11 & treatment_arm == 1) %>% summarise(mean = mean(!!outcome, na.rm = TRUE)) %>% pull(mean) # 拟合回归模型,用!!引用符号变量 reg1 <- felm(!!outcome ~ treatment_arm, data = df) # 生成stargazer表格,修正参数位置与格式 stargazer(reg1, align = TRUE, dep.var.labels = c("(1)"), omit.stat = c("f", "adj.rsq", "ser"), no.space = TRUE, digits = 3, add.lines = list(c('Mean outcome', round(mean_outcome, 3))), dep.var.caption = "", out = paste0(y, ".tex")) } liv_vars <- c("tot_lstock_count", "tot_animal_tlu") # 初始化命名列表,匹配变量名索引 liv_out_list <- vector("list", length(liv_vars)) names(liv_out_list) <- liv_vars for(i in seq_along(liv_vars)) { liv_out_list[[i]] <- reg_coef_tables(df, liv_vars[i]) }
关键修正说明
- 用
sym(y)将输入的字符型变量名转换为符号,再通过!!在dplyr和felm中实现动态引用 - 把
dep.var.caption从add.lines中移出,作为stargazer的独立参数 - 调整列表初始化方式,避免字符索引导致的赋值错误
- 对
mean_outcome做四舍五入,保证与stargazer的digits=3参数格式一致 - 补全
stargazer调用的闭合括号,修复语法错误
内容的提问来源于stack exchange,提问作者Paula
相关产品推荐
相关产品推荐

