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

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)
      )
    })
  }
)

关键修改点

  1. 传递实际初始值:给shinyInput的value参数传入reactive对象的实际值(如tst()而非tst),确保输入框能读取到预设数值
  2. 转为Reactive表格:将初始数据框res设为reactive对象,保证初始值变化时表格能同步更新
  3. 优化空值处理:修改shinyValue函数,增加default参数,初始状态下用预设值替代NA,避免计算报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:05:06