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

