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

函数内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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:07:31