在 DataTable 输出中使用 Shiny 输入

Posted

技术标签:

【中文标题】在 DataTable 输出中使用 Shiny 输入【英文标题】:Using Shiny inputs inside a DataTable output 【发布时间】:2016-07-12 14:43:53 【问题描述】:

我想动态创建一系列输入小部件以在数据表的每一行中使用。我能够成功地在表中显示这样的输入列表,但是我无法访问这些动态输入的值。

ui.R

library(shiny)

ui <- fluidPage(

  fluidRow(
    radioButtons('original','Normal Radio Button',c('1','2','3','4','5')),
    DT::dataTableOutput("table")
  )
)

server.R

library(DT)

multipleRadio <- function(FUN, id_nums, id_base, label, choices, ...) 

  inputs <- 1:length(id_nums)
  for (i in 1:length(inputs)) 
    inputs[i] <- as.character(FUN(paste0(id_base, id_nums[i]),label, choices, ...))
  

  return(inputs)


radio_inputs <- multipleRadio(radioButtons,
                       as.character(1:3),
                       'input_',
                       'Radio Button',
                       c('1','2','3','4','5'),
                       inline = TRUE)

output_table <- data.frame(id = c(1,2,3),
                           name=c('Item 1','Item 2','Item 3'),
                           select = radio_inputs)


server <- function(input, output, session) 

  observe(
    print(paste('original: ',input$original))
    print(paste('input 1: ',input$input_1))
    print(paste('input 2: ',input$input_2))
    print(paste('input 3: ',input$input_3))
 )

  output$table <- renderDataTable(   
    datatable(output_table,rownames= FALSE,escape = FALSE,selection='single',
            options = list(paging = FALSE,ordering=FALSE,searching=FALSE))
  )

我定义了一个函数,它生成多个radioButton 输入并使用as.character 将它们转换为它们的html 表示。这会生成一系列输入,其 ID 为“input_1”、“input_2”和“input_3”。我用无线电输入填充输出表的一列。 radioButtons 的显示按预期工作。我在每一行看到一个。但是,input$input_1input$input_2input$input_3 似乎不存在,并且单击这些按钮没有响应。任何关于这里出了什么问题的提示将不胜感激!

编辑:

我在这里找到了解决方案: http://www.***.red/questions/32993257/shiny-datatables-with-interactive-elements

在渲染数据表时使用 Shiny.bindAll 函数似乎可以将 HTML 输入转换为 Shiny 输入对象。

output$table <- renderDataTable( 
    datatable(output_table,rownames= FALSE,escape = FALSE,selection='single',
              options = list(paging = FALSE,ordering=FALSE,searching=FALSE, 
                             preDrawCallback=JS('function()  Shiny.unbindAll(this.api().table().node()); '),
                             drawCallback=JS('function()  Shiny.bindAll(this.api().table().node());  ')))
)

【问题讨论】:

关键是使用renderUI创建动态输入。有关我之前回答的问题,请参阅 ***.com/questions/36094718/r-shiny-dynamic-input/…。 谢谢,@warmoverflow。使用renderUI 生成输入后,如何用它们填充数据表? 您只需读取input$input1 等值 @warmoverflow 啊,我希望小部件本身显示在数据表中,而不是输入的值。对不起,如果我不清楚。 对不起,我误解了你的问题。我怀疑由于 DT 和闪亮的输入都使用 javascript,将一个嵌套在另一个内部会破坏一些东西。 【参考方案1】:

正确的shiny 输入对象是shiny.tag 对象,您不能将其放入data.frame。如果这样做,您将收到以下错误消息:

as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 不能强制类 ""shiny.tag"" 到 data.frame

在您的示例中,您获得的radio_inputs 对象实际上是character 的列表,它是纯HTML 代码。因此,您仍然可以获得 UI,但它们不再用作闪亮的输入。

如果您想要单选按钮或表格内的任何其他闪亮输入对象,我想唯一的方法是使用纯 HTML 表格。

【讨论】:

以上是关于在 DataTable 输出中使用 Shiny 输入的主要内容,如果未能解决你的问题,请参考以下文章

R and Shiny:使用反应函数的输出

在 Shiny 的 DataTable 实现中控制数字格式

如何在Shiny R中丢弃DT :: datatable上的用户编辑

如何在 Shiny 中使用 DataTable Extensions 更改下载文件中的名称?

使用Javascript使用shinyjs将数据表导出为Shiny中的CSV

R语言-在shiny中使用DT包的常用设置