如何在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
相关产品推荐
相关产品推荐

