我正在尝试使用闪亮的模块来重新使用 UI 和服务器代码来呈现共享相同演示文稿的三个不同数据集。
在 UI / 服务器代码之外使用基于 javascript 的模态弹出链接创建时,在处理命名空间时遇到了一些挑战。
这是我的非工作应用程序代码:
library(shiny)
library(shinyBS)
library(DT)
df <- data.frame(id = c('a', 'b', 'c'), value = c(1, 2, 3))
on_click_js = "
Shiny.onInputChange('myLinkName', '%s');
$('#myModal').modal('show')
"
convert_to_link = function(x) {
as.character(tags$a(href = "#", onclick = sprintf(on_click_js, x), x))
}
df$id_linked <- sapply(df$id, convert_to_link)
df <- df[, c('id_linked', 'value')]
mySampleUI <- function(id) {
ns <- NS(id)
fluidPage(
mainPanel(
dataTableOutput(ns('myDT')),
bsModal(id = 'myModal',
title = 'My Modal Title',
trigger = '',
size = 'large',
textOutput(ns('modalDescription'))
),
width = 12
)
)
}
ui <- fluidPage(mySampleUI('myUI'))
myServerFunc <- function(input, output, session, df) {
output$myDT <- DT::renderDataTable({
datatable(df, escape = FALSE, selection='none')
})
output$modalDescription <- renderText({
sprintf('My beautiful %s', input$myLinkName)
})
}
server <- function(input, output) {
callModule(myServerFunc, 'myUI', df)
}
shinyApp(ui = ui, server = server)
工作版本将成功显示myLinkName
在模式弹出窗口的描述部分。此代码不起作用的原因是 UI 组件 ID 值是在没有命名空间包含的 UI 代码之外创建的。我明白了。但是,我无法弄清楚如何重新工作以使名称空间匹配。
有什么想法/选择吗?