如何将响应式值插入rhandsontable表格?
实现方案
要将下拉选择的值同步到rhandsontable的第二行(Term B),只需添加监听下拉框变化的响应式逻辑,更新表格对应单元格即可,具体修改如下:
关键修改点
- 新增监听
input$choices变化的响应式逻辑,每次选择新值时,更新uiTable中第二行第一列的内容 - 确保更新时保留表格其他行已编辑的内容
修改后的完整代码
library(rhandsontable) library(shiny) library(shinyjs) mydata <- data.frame('Series 1' = c(1,12,0,1), check.names = FALSE) rownames(mydata) <- c('Term A','Term B','Term C','Term D') ui <- fluidPage( useShinyjs(), br(), uiOutput("choices"), rHandsontableOutput('hottable') ) server <- function(input, output) { uiTable <- reactiveVal(mydata) # 监听表格编辑,更新响应式数据 observeEvent(input$hottable, { uiTable(hot_to_r(input$hottable)) }) # 监听下拉选择,更新表格第二行的值 observeEvent(input$choices, { current_data <- uiTable() # 修改第二行(Term B)第一列的值 current_data[2, 1] <- as.numeric(input$choices) uiTable(current_data) }) output$hottable <- renderRHandsontable({ rhandsontable(uiTable(), rowHeaderWidth = 100, useTypes = TRUE)%>% hot_context_menu(allowRowEdit = FALSE, allowColEdit = FALSE) %>% hot_cols( colWidths = 80, renderer = "function(instance, td, row, col, prop, value, cellProperties) { Handsontable.renderers.NumericRenderer.apply(this, arguments); if(instance.params && 1 === row) {td.style.background = '#eff0f1'} // 高亮第二行(JS索引为1) }" ) %>% hot_row(c(2), readOnly = TRUE) # 设置第二行为只读 }) output$choices <- renderUI( selectInput( "choices", label = "用户选择值以显示在下方表格的第二行:", choices = c(1,2,3) ) ) } shinyApp(ui,server)
说明
observeEvent(input$choices, ...)会在用户选择新值时触发,先获取当前表格的最新数据,再修改第二行的对应单元格,最后更新uiTable响应式值- 因为第二行设置为
readOnly = TRUE,用户无法直接编辑该行,只能通过下拉框修改,保证数据一致性 - 表格其他行的编辑内容会被保留,更新下拉选择时不会覆盖其他行的修改
内容的提问来源于stack exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

