我正在尝试将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。
谢谢!