Shiny App可编辑表格预设初始值失效问题求助
解决Shiny App可编辑表格初始值填充问题
问题背景
需要开发一个Shiny App,实现以下功能:
- 用户通过可编辑表格测试场景评估函数
DCF_dwd - 三个场景预设初始值分别为0.05、0.1、0.25,且允许用户修改
- 输入输出表需基于初始值自动完成计算
当前App其余功能正常,但输入框无法加载预设初始值,预期的初始值未显示,计算也无法基于初始值执行。
问题原因
给shinyInput函数传递初始值时,直接传入了reactive对象(如tst、tst2)而非其实际值;同时初始数据框未设为reactive,导致初始值无法被正确渲染到输入框中。
修改后的完整代码
rm(list = ls()) library(shiny) library(DT) DCF_dwd <- function(COC) { 1 / COC } x007 <- 0.05 shinyApp( ui = fluidPage( h4("Inputs"), DT::dataTableOutput("x1"), h4("Inputs and Outputs"), DT::dataTableOutput("x2") ), server = function(input, output) { x <- reactive({ x007 }) # 创建Shiny输入控件的字符向量 shinyInput <- function(FUN, len, id, ...) { inputs <- character(len) for (i in seq_len(len)) { inputs[i] <- as.character(FUN(paste0(id, i), label = NULL, ...)) } inputs } # 获取输入控件的值,增加默认值处理 shinyValue <- function(id, len, default) { unlist(lapply(seq_len(len), function(i) { value <- input[[paste0(id, i)]] if (is.null(value)) default else value })) } tst <- reactive({ x() }) tst2 <- reactive({ x() + 0.05 }) tst3 <- reactive({ x() + 0.2 }) # 将初始表格转为reactive对象,确保初始值能正确渲染 res <- reactive({ data.frame( Scenario1 = shinyInput(numericInput, 1, "Scenario1_", value = tst()), Scenario2 = shinyInput(numericInput, 1, "Scenario2_", value = tst2()), Scenario3 = shinyInput(numericInput, 1, "Scenario3_", value = tst3()), stringsAsFactors = FALSE, row.names = c("WACC") ) }) # 渲染包含输入控件的表格 output$x1 <- DT::renderDataTable( res(), server = FALSE, escape = FALSE, selection = "none", options = list( preDrawCallback = JS("function() { Shiny.unbindAll(this.api().table().node()); }"), drawCallback = JS("function() { Shiny.bindAll(this.api().table().node()); } "), dom = "tip", bFilter = 0, bSort = 0, bProcessing = 0, bPaginate = 0, bInfo = 0 ) ) # 计算并渲染输入输出表 d <- reactive({ cocVec <- c( shinyValue("Scenario1_", 1, tst()), shinyValue("Scenario2_", 1, tst2()), shinyValue("Scenario3_", 1, tst3()) ) out1 <- DCF_dwd(cocVec[1]) out2 <- DCF_dwd(cocVec[2]) out3 <- DCF_dwd(cocVec[3]) data.frame( Scenario1 = c(cocVec[1], out1), Scenario2 = c(cocVec[2], out2), Scenario3 = c(cocVec[3], out3), row.names = c("WACC", "Sum of DCF") ) }) output$x2 <- DT::renderDataTable({ datatable( d(), filter = "none", options = list(dom = "tip", bFilter = 0, bSort = 0, bProcessing = 0, bPaginate = 0, bInfo = 0) ) }) } )
关键修改点
- 传递实际初始值:给
shinyInput的value参数传入reactive对象的实际值(如tst()而非tst),确保输入框能读取到预设数值 - 转为Reactive表格:将初始数据框
res设为reactive对象,保证初始值变化时表格能同步更新 - 优化空值处理:修改
shinyValue函数,增加default参数,初始状态下用预设值替代NA,避免计算报错
内容的提问来源于stack exchange,提问作者DashdotdotDashdotdot
相关产品推荐
相关产品推荐

