如何在DT单元格内使用Shinyjqui :: orderInput

时间:2019-04-12 03:05:58

标签: javascript r shiny

我正在尝试将shinyjqui包中的orderInput元素放在DT表中。放置诸如复选框之类的简单输入可以相当容易地完成。由于这些输入更为复杂,因此我对this one采用了类似的方法。尽管输入能够正确呈现,但是它们的功能却无法正常工作-我知道这是因为它们的javascript初始化不正确(由于对as.character()的调用)。这是我的代码:

library(shiny)
library(shinyjqui)

ui <- shinyUI(
  fluidPage(
    h2('Reorder'),
    DT::dataTableOutput('mytable')
  )
)

server = shinyServer(function(input, output, session) {

  data <- head(mtcars)

  # helper function for making inputboxes in a DT
  shinyInput = function(FUN, BrandID, stem, items, id,connect,  ...) { 
    unlist(lapply(seq_len(length(items)), function(x){
      as.character(FUN(inputId=paste(id, stem, BrandID[x], sep="_"), label = NULL, items=items[x],connect[-x], ...))
    }))
  } 

  # datatable with orderinputs
  output$mytable = DT::renderDataTable({
    x <- data.frame(
      sapply(seq(ncol(data)), function(x){
        shinyInput(FUN=shinyjqui::orderInput,
                   BrandID=as.character(rownames(data)), 
                   stem=names(data)[x], 
                   items=as.character(data[,x]),
                   id="OrdImp",
                   connect=paste("OrdImp", names(data)[x], as.character(rownames(data)), sep="_"),
                   as_source=T,
                   width="20%", 
                   item_class='primary')
      })
    )
    names(x) <- names(data)
    rownames(x) <- rownames(data)

    data.frame(x)
  }, escape = FALSE, options = list( 
    preDrawCallback = JS('function() {Shiny.unbindAll(this.api().table().node());}'), 
    drawCallback = JS('function() {Shiny.bindAll(this.api().table().node());} ') 
  ))
}
)

shinyApp(ui = ui, server = server)

必须调用as.character(),以便元素甚至可以在HTML中呈现,但是它会从闪亮的标记中删除javascript元数据。需要运行一些JavaScript来初始化这些输入-与this SO answer that manually runs javascript to initialize selectInputs inside DT类似。我需要帮助来找出可以使这项工作正常工作的javascript。

谢谢!

0 个答案:

没有答案