Shiny中输入数据为data.table时checkboxGroupInput失效问题求助
问题修复方案
问题原因
当使用data.table时,diamonds2[, input$show_vars]在仅选择单个列时会返回一维向量,而DT的renderDataTable要求输入必须是二维结构(如data.frame/data.table),因此抛出错误。
修复方法1:使用with=FALSE参数
在data.table的索引中添加with=FALSE,强制按列名索引返回二维data.table,和data.frame的行为一致:
library(shiny) library(ggplot2) # for the diamonds dataset library(data.table) # 需显式加载data.table包 ui <- fluidPage( title = "Examples of DataTables", sidebarLayout( sidebarPanel( checkboxGroupInput("show_vars", "Columns in diamonds to show:", names(diamonds), selected = names(diamonds)) ), mainPanel( tabsetPanel( tabPanel("diamonds", DT::dataTableOutput("mytable1")) ) ) ) ) server <- function(input, output) { # choose columns to display diamonds2 = as.data.table(diamonds[sample(nrow(diamonds), 1000), ]) output$mytable1 <- renderDataTable({ diamonds2[, input$show_vars, with = FALSE] # 添加with=FALSE参数 }) } shinyApp(ui, server)
修复方法2:使用data.table的.SDcols语法
这是更符合data.table设计习惯的写法,通过.SDcols指定要选择的列,返回二维data.table:
library(shiny) library(ggplot2) # for the diamonds dataset library(data.table) ui <- fluidPage( title = "Examples of DataTables", sidebarLayout( sidebarPanel( checkboxGroupInput("show_vars", "Columns in diamonds to show:", names(diamonds), selected = names(diamonds)) ), mainPanel( tabsetPanel( tabPanel("diamonds", DT::dataTableOutput("mytable1")) ) ) ) ) server <- function(input, output) { # choose columns to display diamonds2 = as.data.table(diamonds[sample(nrow(diamonds), 1000), ]) output$mytable1 <- renderDataTable({ diamonds2[, .SD, .SDcols = input$show_vars] # 使用.SD和.SDcols指定列 }) } shinyApp(ui, server)
注意:两种方法都需要确保加载data.table包(原代码中遗漏了),否则as.data.table会报错。
内容的提问来源于stack exchange,提问作者Mohammed Barakat
相关产品推荐
相关产品推荐

