在DataTable输出中使用Shiny输入

时间:2016-03-24 20:55:17

标签: r datatables shiny

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

ui.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))
  })
}

server.R

input$input_1

我定义了一个生成多个radioButton输入的函数,并使用as.character将它们转换为HTML表示形式。这会生成一系列输入,其ID为&#34; input_1&#34;,&#34; input_2&#34;和&#34; input_3。&#34;我用无线电输入填充输出表的一列。 radioButtons的显示按预期工作。我看到每排一个。但是,input$input_2input$input_3output$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()); } '))) }) 似乎不存在,并且没有点击这些按钮的响应。关于这里出了什么问题的任何提示将不胜感激!

修改

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

渲染数据表时使用Shiny.bindAll函数会将HTML输入转换为Shiny输入对象。

import numpy as np

a = [[1,2],[3,1]]
b = [[3,6],[2,9]]
c = [[5,1],[8,10]]

print np.hstack((np.hstack((a,b)),c))

# [[ 1  2  3  6  5  1]
# [ 3  1  2  9  8 10]]

1 个答案:

答案 0 :(得分:0)

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

  

as.data.frame.default(x [[i]],可选= TRUE时出错,   stringsAsFactors = stringsAsFactors):不能强制类   “”shiny.tag“”到data.frame

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

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