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

如何在Shiny应用中选中DT行后通过侧边栏组件点击按钮修改对应单元格值

实现方案

你需要补充选中行自动填充输入、点击编辑更新数据两个核心逻辑,修改后的完整可运行代码如下:

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(DT)
library(tibble)
Input <- structure(list(`Security Type` = c("Stock", "Stock", "Load Fund"), Ticker = c("XOM", "NFLX", "AMCPX"), `Purchase Date` = structure(c(
  16070,
  17084, 17084
), class = "Date"), `Sale Date` = structure(c(
  18627,
  NA, 18545
), class = "Date"), `Amount Invested` = c(
  "$10,000",
  "$8,000", "$10,000"
)), class = c(
  "spec_tbl_df", "tbl_df", "tbl",
  "data.frame"
), row.names = c(NA, -3L))
shinyApp(
  ui = tags$body(class = "skin-blue sidebar-mini control-sidebar-open", dashboardPage(
    options = list(sidebarExpandOnHover = TRUE),
    header = dashboardHeader(title = "Investment Advisor Monitoring - Insider Trading", titleWidth = 450),
    sidebar = dashboardSidebar(
      minified = F, collapsed = F,
      selectInput(
        "sectype", "Security Type",
        c(unique(Input$`Security Type`))
      ),
      selectInput(
        "sectick", "Ticker",
        c(unique(Input$Ticker))
      ),
      dateInput("PurDate", "Purchase Date", value = as.Date("2013-12-31")),
      dateInput("selDate", "Sale Date", value = as.Date("2019-01-31")),
      selectInput(
        "aminv", "Amount Invested",
        c(unique(Input$`Amount Invested`))
      ),
      actionButton("edit", "Edit")
    ),
    body = dashboardBody(
      h3("Results"),
      tabsetPanel(
        id = "tabs",
        tabPanel(
          "InsiderTraining",
          dataTableOutput("TBL1")
        )
      )
    ),
    controlbar = dashboardControlbar(width = 300),
    title = "DashboardPage"
  )),
  server = function(input, output, session) {
    # Init with some example data
    data <- reactiveVal(Input)
    
    # 新增:选中表格行时自动将行值填充到侧边栏输入组件
    observeEvent(input$TBL1_rows_selected, {
      selected_row <- input$TBL1_rows_selected
      current_df <- data()
      updateSelectInput(session, "sectype", selected = current_df$`Security Type`[selected_row])
      updateSelectInput(session, "sectick", selected = current_df$Ticker[selected_row])
      updateDateInput(session, "PurDate", value = current_df$`Purchase Date`[selected_row])
      updateDateInput(session, "selDate", value = current_df$`Sale Date`[selected_row])
      updateSelectInput(session, "aminv", selected = current_df$`Amount Invested`[selected_row])
    })
    
    # 补充编辑按钮逻辑
    observeEvent(input$edit,{
      if (!is.null(input$TBL1_rows_selected)) {
        selected_row <- input$TBL1_rows_selected
        temp_df <- data()
        # 用输入组件的新值覆盖选中行对应列
        temp_df$`Security Type`[selected_row] <- input$sectype
        temp_df$Ticker[selected_row] <- input$sectick
        temp_df$`Purchase Date`[selected_row] <- input$PurDate
        temp_df$`Sale Date`[selected_row] <- input$selDate
        temp_df$`Amount Invested`[selected_row] <- input$aminv
        # 更新响应式数据,表格会自动刷新
        data(temp_df)
      }
    })
    output$TBL1 <- renderDataTable(
      data(),selection="single"
    )
  }
)

关键修改说明

  • 新增了选中行监听逻辑:当用户点击表格任意行时,自动把该行的所有列值同步到侧边栏的输入组件中,你可以直接在原有值基础上修改,不需要手动重填所有字段
  • 补充了编辑按钮的更新逻辑:点击Edit按钮后,会读取当前侧边栏所有输入组件的值,覆盖到你选中的行的对应列,响应式数据更新后DT表格会自动重绘展示最新值
  • 注意server函数新增了session参数,调用update*Input系列函数必须传入session参数才能正常更新输入组件的值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:07