Shiny应用中如何在渲染输出前对计算生成的表格进行编辑
解决方法
核心原理:Shiny中eventReactive/reactive生成的是响应式函数对象,必须通过变量名()的形式才能获取其存储的实际数据集,直接对响应式对象本身执行dplyr操作会触发报错。可选择以下任意一种方案实现需求:
方案1:直接在原始估算逻辑中嵌入处理
适合不需要保留未拆分的原始估算结果的场景,修改原estimate的eventReactive代码即可:
estimate<-eventReactive(input$go,{ # 运行原始估算函数得到未处理结果 raw_estimate <- MRIP.catch(intdir='C:\\Users\\', st = 12, styr = yr1(), endyr= yr2(), common = sp() , dom = dom1() ) # 执行字段拆分、映射逻辑 processed_estimate <- raw_estimate %>% mutate (yr = substr(Domain, 5,8), wave1=substr(Domain,13,13), basin1=substr(Domain,25,25), mode1=substr(Domain, 33,33), area1=substr(Domain, 40,40), cntys1=substr(Domain, 45,45), yr_wave=paste(yr,wave1, sep='-')) %>% mutate (basin = case_when (basin1 == '6' ~'SA', basin1=='7'~'Gulf', basin1=='1'~'statewide' ), mode = case_when(mode1=='1'~'combined', mode1 =='3'~'Shore', mode1=='5'~'Charter', mode1=='7'~'Private'), area = case_when(area1 =='1'~'EC state', area1=='2'~'EC fed', area1=='3'~'Gulf state', area1=='4'~'Gulf fed', area1=='5'~'Inland')) return(processed_estimate) })
后续renderTable无需修改,直接调用estimate()即可返回处理后的表格。
方案2:单独新增处理后的响应式变量
适合需要同时保留原始估算结果、供其他输出逻辑调用的场景,在原有代码基础上新增以下内容:
# 原有estimate的eventReactive逻辑保持不变 estimate<-eventReactive(input$go,{ MRIP.catch(intdir='C:\\Users\\', st = 12, styr = yr1(), endyr= yr2(), common = sp() , dom = dom1() ) }) # 新增处理后的响应式变量 processed_estimate <- reactive({ req(estimate()) # 确保原始估算结果生成后再执行处理,避免空值报错 estimate() %>% mutate (yr = substr(Domain, 5,8), wave1=substr(Domain,13,13), basin1=substr(Domain,25,25), mode1=substr(Domain, 33,33), area1=substr(Domain, 40,40), cntys1=substr(Domain, 45,45), yr_wave=paste(yr,wave1, sep='-')) %>% mutate (basin = case_when (basin1 == '6' ~'SA', basin1=='7'~'Gulf', basin1=='1'~'statewide' ), mode = case_when(mode1=='1'~'combined', mode1 =='3'~'Shore', mode1=='5'~'Charter', mode1=='7'~'Private'), area = case_when(area1 =='1'~'EC state', area1=='2'~'EC fed', area1=='3'~'Gulf state', area1=='4'~'Gulf fed', area1=='5'~'Inland')) }) # 修改renderTable调用处理后的变量 output$table<-renderTable({processed_estimate()})
内容的提问来源于stack exchange,提问作者JulieV
相关产品推荐
相关产品推荐

