Я пытаюсь разместить элементы orderInput (из пакета shinyjqui
) внутри таблицы DT
.Размещение простых вводов, таких как флажки, может быть сделано довольно легко.Поскольку эти входы более сложны, я следовал аналогичному подходу к этому .Хотя входные данные отображаются правильно, их функциональность не работает - и я знаю, что это потому, что их 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 должен быть запущен для инициализации этих входных данных - подобно этому SO-ответу, который вручную запускает javascript для инициализации selectInputs внутри DT .Мне нужна помощь, чтобы выяснить этот кусочек javascript, который бы помог этой работе.
Спасибо!