我试图在一个名为 "Shiny "的输入端中使用 DT::datatable
的模块内的回调函数。不幸的是,我不懂JavaScript,所以我在使用 DT::renderDataTable
. 使用概述的方法 此处 其后 一辉的应用 当datatable在模块内呈现时,回调失败。经过一番搜索,我 创办 回调需要针对命名空间进行调整,但由于这里的默认回调并没有通过名称引用任何输入,我不知道该如何调整它。请看下面的一个可重现的例子。
library(shiny)
library(DT)
module_ui = function(id, label) {
ns = NS(id)
tagList(
DT::dataTableOutput(ns('foo')),
verbatimTextOutput(ns('sel'))
)
}
module_server = function(input, output, session){
ns = session$ns
data <- head(iris, 5)
for (i in 1:nrow(data)) {
data$species_selector[i] <- as.character(selectInput(paste0("sel", i), "", choices = unique(iris$Species), width = "100px"))
}
output$foo = DT::renderDataTable(
data, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 't', paging = FALSE, ordering = FALSE),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-container');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());")
)
output$sel = renderPrint({
str(sapply(1:nrow(data), function(i) input[[paste0("sel", i)]]))
})
}
ui <- fluidPage(
title = 'Selectinput column in a table',
h3("Source:", tags$a("Yihui Xie", href = "https://yihui.shinyapps.io/DT-radio/")),
module_ui("tabl")
)
server <- function(input, output, session) {
callModule(module_server, "tabl")
}
shinyApp(ui, server)
任何帮助都将是非常感激的!
我发现我的代码中出现了一个错误:当分配上面的输入时,需要像在模块中分配输入时一样,将名字空间包住它们的ID。session$ns(paste0("sel", i))
. 原本以为我已经这样做了,但显然没有。总之,下面是工作解决方案,以防对大家有帮助。
library(shiny)
library(DT)
module_ui = function(id, label) {
ns = NS(id)
tagList(
DT::dataTableOutput(ns('foo')),
verbatimTextOutput(ns('sel'))
)
}
module_server = function(input, output, session){
ns = session$ns
data <- head(iris, 5)
for (i in 1:nrow(data)) {
data$species_selector[i] <- as.character(selectInput(ns(paste0("sel", i)), "", choices = unique(iris$Species), width = "100px"))
}
output$foo = DT::renderDataTable(
data, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 't', paging = FALSE, ordering = FALSE),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-container');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());")
)
output$sel = renderPrint({
str(sapply(1:nrow(data), function(i) input[[paste0("sel", i)]]))
})
}
ui <- fluidPage(
title = 'Selectinput column in a table',
h3("Source:", tags$a("Yihui Xie", href = "https://yihui.shinyapps.io/DT-radio/")),
module_ui("tabl")
)
server <- function(input, output, session) {
callModule(module_server, "tabl")
}
shinyApp(ui, server)