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

Shiny应用中遍历数据框逐行运算后结果数据框无数据如何解决?

问题根源

  1. 逻辑载体选择错误:你将点击按钮后要执行的逻辑写在了eventReactive中,该类反应式对象仅在被其他反应式上下文主动调用时才会运行代码,你当前没有任何位置调用该反应式,因此内部的循环、赋值逻辑从未执行,自然没有生成数据。
  2. DT代理ID不匹配:你定义的DT输出ID为envio,但创建数据代理时传入的ID是tarifas,代理找不到对应表格,即便逻辑运行也无法正确更新前端展示。
  3. 临时表初始化位置错误:myTable2在服务端启动时就通过isolate获取了初始空表,若后续初始化逻辑有延迟,或多次点击按钮会导致数据异常累积。
  4. 无触发条件的observe存在隐患:你初始化cot$tarifas的observe没有指定依赖,虽然当前逻辑下仅启动运行一次,但若后续不小心加入其他反应式依赖,会触发重复初始化清空已生成的数据。

修复方案

  1. 将eventReactive替换为observeEvent,直接绑定input$continue点击事件,点击按钮即可自动执行内部逻辑。
  2. 修正DT代理的ID为envio,和输出ID保持一致。
  3. 将myTable2的初始化移入observeEvent内部,每次点击按钮都重新生成新的结果表,避免脏数据。
  4. 建议将初始化cot$tarifas的逻辑直接放在reactiveValues定义时完成,不需要额外用observe包裹。

修正后代码示例:

# 初始化直接定义空表,不需要额外observe
cot <- reactiveValues(
  tarifas = tibble(
    Row = numeric(0),
    "Fondo" = character(0), 
    "Region"= character(0), 
    "Estado"= character(0),
    "Cultivo"= character(0), 
    "Infraestructura"= character(0), 
    "Riesgos"= character(0),
    "Unidad de Riesgo"= character(0),
    "Subramo" = character(0), 
    "Nivel de S.A." = numeric(0), 
    "Deducible" = character(0), 
    "Part. Perdida" = character(0), 
    "Tarifa" = numeric(0)
  )
)

# 修正代理ID为envio,和输出ID匹配
proxyTable2 <- DT::dataTableProxy("envio")

output$envio <- renderDT({
  DT::datatable(cot$tarifas[,-1],
                rownames = FALSE,
                escape   = FALSE)
})

# 用observeEvent替代eventReactive,绑定点击事件
observeEvent(input$continue,{
  # 每次运行先初始化空临时表
  myTable2 <- cot$tarifas
  # 可取消注释下方调试语句,在R控制台查看输入数据是否正常
  # print(paste("待处理行数:", nrow(values$df)))
  for (j in 1:nrow(values$df)) {
    cotizacion <- busca_folios(
      fondo_edo(), 
      cultivos(),
      values$df$Fondo[j], 
      values$df$Region[j],
      values$df$Cultivo[j],
      values$df$`Sistema de produccion`[j], 
      values$df$`Seguro agricultura protegida`[j],
      values$df$`Unidad de riesgo`[j], 
      values$df$Riesgos[j], 
      values$df$Deducible[j],
      values$df$`Participacion a perdida`[j]
    )
    
    if(nrow(cotizacion) > 0){
      myTable2 <- bind_rows(myTable2, tibble(Row = rep(1,3)) %>%
                              add_column(cotizacion))
    }else{
      cotizacion2 <- calculo(
        fondo_edo(),
        cultivos(),
        values$df[j,1],
        values$df$Region[j], 
        values$df$Cultivo[j],
        values$df$`Sistema de produccion`[j], 
        values$df$`Seguro agricultura protegida`[j],
        values$df$`Unidad de riesgo`[j], 
        ordena_riesgos(values$df$Riesgos[j]),
        separa_vector(values$df$Deducibles[j]), 
        separa_vector(values$df$PPs[j]), 
        values$df$Fondo[j]
      )
      
      myTable2 <- bind_rows(myTable2, tibble(Row = rep(1,3)) %>%
                              add_column(cotizacion2))
    }
  }
  replaceData(proxyTable2, myTable2[,-1], resetPaging = FALSE)
  cot$tarifas <- myTable2
})

内容的提问来源于stack exchange,提问作者Adriana Huante

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:24:03