如何在rhandsontable表格仅最后一行添加下拉菜单(其余行存数值)
问题解决:rhandsontable仅指定行添加下拉菜单并支持动态列
需求说明
需要在rhandsontable渲染的表格中实现:
- 仅最后一行(
Row_C_dropdown)显示下拉菜单,选项为NA、Item A、Item B - 其余两行(
Row_A_numeric、Row_B_numeric)保留数值输入功能 - 支持通过「Add series」按钮动态添加列,新增列的最后一行同样渲染下拉菜单
修改后的完整代码
library(rhandsontable) library(shiny) ui <- fluidPage( rHandsontableOutput('hottable_1'), actionButton("addSeries","Add series") ) server <- function(input,output,session)({ seriesTbl_1 <- reactiveVal( data.frame( 'Series 1' = c(1,24,NA), row.names = c("Row_A_numeric","Row_B_numeric","Row_C_dropdown") ) ) observeEvent(input$hottable_1, {seriesTbl_1(hot_to_r(input$hottable_1))}) output$hottable_1 <- renderRHandsontable({ tbl <- seriesTbl_1() select_option <- c(NA_character_, "Item A", "Item B") rhandsontable( tbl, rowHeaderWidth = 200, useTypes = TRUE, selectCallback = TRUE, overflow = "visible" ) %>% hot_table(id = "hottable_1") %>% # 先将所有列默认设置为数值类型,保证前两行是数值输入 hot_col( col = names(tbl), allowInvalid = FALSE, type = "numeric" ) %>% # 循环遍历每一列,单独给最后一行设置下拉菜单 { tbl_render <- . for(col_name in names(tbl)){ tbl_render <- tbl_render %>% hot_cell( row = 3, # 对应行名Row_C_dropdown的行索引(行从1开始计数) col = col_name, type = "dropdown", source = select_option ) } tbl_render } }) observeEvent(input$addSeries, { newSeriesCol_1 <- data.frame(c(1,24,NA)) names(newSeriesCol_1) <- paste("Series", ncol(hot_to_r(input$hottable_1)) + 1) seriesTbl_1(cbind(seriesTbl_1(), newSeriesCol_1)) }) seriesTbl_1_DF <- reactive({seriesTbl_1()}) }) shinyApp(ui, server)
关键修改说明
- 全局列类型设置:先通过
hot_col将所有列统一设置为numeric类型,确保前两行的数值输入功能正常。 - 指定行单独配置:使用循环遍历表格的每一列,通过
hot_cell函数精准定位到最后一行(第3行,行索引从1开始),将该单元格设置为dropdown类型并指定下拉选项。 - 动态列兼容:新增列的结构与初始列完全一致,渲染逻辑会自动覆盖新添加的列,保证新增列的最后一行同样显示下拉菜单。
内容的提问来源于stack exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

