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

如何为R Shiny中动态生成的rhandsontable分配自定义ID以获取修改后内容

可以给rhandsontable分配自定义ID,通过该ID即可读取用户修改后的表格内容。

核心原理

你之前给外层div设置id的方式无效,rhandsontable的用户输入值绑定的是其对应的Shiny Output ID,只要给每个动态生成的rhandsontable分配唯一的合法Output ID,就能通过input$[自定义ID]结合hot_to_r()函数拿到修改后的表格数据。

可运行修改版代码

library(shiny)
library(rhandsontable)
library(shinyWidgets)
library(dplyr)

ui <- fluidPage(
  fluidRow(
    uiOutput('test'),
    actionBttn(
      inputId = "Id107",
      label = "button",
      style = "unite", 
      color = "danger"
    )
  )
)

server <- function(input, output, session) {
  var1 <-c(1,2,3)
  var2 <-c('X','Y','Z')
  var3 <-c('Sample1','Sample2')
  
  observeEvent(input$Id107,{
    browser()
    # 进入browser后可执行以下代码验证拿取修改后的表格值
    # 示例:拿Sample1的Alpha表格数据
    # hot_to_r(input$Sample1_Alpha)
    # 示例:拿Sample2的Gamma表格数据
    # hot_to_r(input$Sample2_Gamma)
  })
  
  output$test = renderUI({
    table_names<-c('Alpha', 'Beta', 'Gamma')
    t<- matrix(data = 0, nrow = length(var2), ncol = length(var1)) %>%
      `rownames<-`(c(var2)) %>%
      `colnames<-`(c(var1))
    t1<-t
    t2<-t
    input_list <- lapply(1:length(var3), function(i) {
      new_list <- lapply(1:length(table_names),function(j) paste(var3[i] ," ", table_names[j], sep = "") )
      # 生成三个表格的唯一合法ID
      id_alpha = gsub("[^[:alnum:]]", "_", new_list[1])
      id_beta = gsub("[^[:alnum:]]", "_", new_list[2])
      id_gamma = gsub("[^[:alnum:]]", "_", new_list[3])
      
      # 给每个ID绑定renderRHandsontable
      output[[id_alpha]] <- renderRHandsontable({
        rhandsontable(t, overflow='hidden',maxRows=nrow(t), minRows=nrow(t)) %>% 
          hot_validate_numeric(c(1:ncol(t))) %>%
          hot_table(stretchH = "all") %>%
          hot_col(c(1:ncol(t)),format = "$0,0")
      })
      
      output[[id_beta]] <- renderRHandsontable({
        rhandsontable(t1, overflow='hidden',maxRows=nrow(t1), minRows=nrow(t1)) %>% 
          hot_validate_numeric(c(1:ncol(t1))) %>%
          hot_table(stretchH = "all") %>%
          hot_col(c(1:ncol(t1)),format = "0.00%")
      })
      
      output[[id_gamma]] <- renderRHandsontable({
        rhandsontable(t2, overflow='hidden',maxRows=nrow(t2), minRows=nrow(t2)) %>% 
          hot_validate_numeric(c(1:ncol(t2))) %>%
          hot_table(stretchH = "all") %>%
          hot_col(c(1:ncol(t2)),format = "0")
      })
      
      list(
        column(12,
               column(5,align='left',withTags(div(h5(b(new_list[1]))))),
               column(4,align='left',withTags(div(h5(b(new_list[2]))))),
               column(3,align='left',withTags(div(h5(b(new_list[3]))))),
        ),
        column(12,
               column(5, rHandsontableOutput(id_alpha)),
               column(4, rHandsontableOutput(id_beta)),
               column(3, rHandsontableOutput(id_gamma))
        )
      )
    })
    do.call(tagList,input_list)
  })
}
shinyApp(ui, server)

批量读取说明

如果需要批量读取所有动态生成的表格内容,可以提前把所有生成的ID存到一个响应式向量里,后续循环通过input[[id]]结合hot_to_r()即可批量获取所有表格数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:04