我想用renderDataTable()函数在Shiny中显示一个表。我想为每一行创建2个复选框。我正在使用checkboxInput()函数创建这些复选框。 复选框已创建,但是当我尝试使用input $ checkbox_id读取它们时,我得到NULL。
使用renderTable()可以实现相同的技巧,但是我的客户希望使用DT表的其他功能(排序,过滤)。
如果我检查生成的HTML,我会看到renderTable()插入了额外的class =“ shiny-bound-input”到标记中。 renderDataTable()不会。
library(shiny)
shinyApp(
ui = fluidPage(
fluidRow(
column(12,dataTableOutput('dataTableOutput')),
column(12,tableOutput('tableOutput')),
actionButton('printCheckStatus','printCheckStatus')
)
),
server = function(input, output) {
df1 <- data.frame(CheckBoxColumn=as.character(checkboxInput("id_1",NULL)))
df2 <- data.frame(CheckBoxColumn=as.character(checkboxInput("id_2",NULL)))
output$dataTableOutput <- renderDataTable(df1,escape = FALSE)
output$tableOutput <- renderTable(df2, sanitize.text.function = function(x) x)
observeEvent(input$printCheckStatus, {print(input$id_1);print(input$id_2)})
}
)
该代码生成一个按钮和两个表,每个表包含一个复选框。 当我单击按钮时,控制台中显示NULL和FALSE。 FALSE是正确的,因为未选中第二个复选框。我得到NULL,因为Shiny服务器会话中不存在input $ id_1。 我希望控制台日志中为FALSE和FALSE。
答案 0 :(得分:1)
您可以使用DT软件包(基于Georgiy’s approach):
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
fluidRow(
column(12,dataTableOutput('dataTableOutput')),
column(12,tableOutput('tableOutput')),
actionButton('printCheckStatus','printCheckStatus')
)
),
server = function(input, output) {
df1 <- data.frame(CheckBoxColumn=as.character(checkboxInput("id_1",NULL)))
df2 <- data.frame(CheckBoxColumn=as.character(checkboxInput("id_2",NULL)))
output$dataTableOutput <- renderDataTable(df1,escape = FALSE, server = FALSE,
callback = JS("table.cells().every(function(i, tab, cell) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-checkbox');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());"))
output$tableOutput <- renderTable(df2, sanitize.text.function = function(x) x)
observeEvent(input$printCheckStatus, {print(input$id_1);print(input$id_2)})
}
)