Shiny应用中遍历数据框逐行运算后结果数据框无数据如何解决?
问题根源
- 逻辑载体选择错误:你将点击按钮后要执行的逻辑写在了
eventReactive中,该类反应式对象仅在被其他反应式上下文主动调用时才会运行代码,你当前没有任何位置调用该反应式,因此内部的循环、赋值逻辑从未执行,自然没有生成数据。 - DT代理ID不匹配:你定义的DT输出ID为
envio,但创建数据代理时传入的ID是tarifas,代理找不到对应表格,即便逻辑运行也无法正确更新前端展示。 - 临时表初始化位置错误:
myTable2在服务端启动时就通过isolate获取了初始空表,若后续初始化逻辑有延迟,或多次点击按钮会导致数据异常累积。 - 无触发条件的observe存在隐患:你初始化
cot$tarifas的observe没有指定依赖,虽然当前逻辑下仅启动运行一次,但若后续不小心加入其他反应式依赖,会触发重复初始化清空已生成的数据。
修复方案
- 将
eventReactive替换为observeEvent,直接绑定input$continue点击事件,点击按钮即可自动执行内部逻辑。 - 修正DT代理的ID为
envio,和输出ID保持一致。 - 将
myTable2的初始化移入observeEvent内部,每次点击按钮都重新生成新的结果表,避免脏数据。 - 建议将初始化
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
相关产品推荐
相关产品推荐

