Ich versuche, glänzende Module zu verwenden, um den UI- und Server-Code wiederzuverwenden, um aus drei verschiedenen Datensätzen zu präsentieren, die die gleiche Präsentation teilen.Shiny Module Namespace außerhalb der Benutzeroberfläche für JavaScript-Links
Ein wenig Herausforderung bei der Verwendung von Namespaces, wenn JavaScript-basierte modale Popup-Link-Erstellung außerhalb des UI/Server-Codes verwendet wird.
Hier ist mein Nicht-Arbeits App-Code:
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)
Eine Arbeitsversion erfolgreich myLinkName
in der Beschreibung Teil des Modal Pop-up anzeigen würde. Der Grund dafür, dass dieser Code nicht funktioniert, liegt darin, dass der UI-Komponenten-ID-Wert außerhalb des UI-Codes ohne den Namespace Containment erstellt wird. Ich verstehe das. Aber ich bin nicht in der Lage herauszufinden, wie man es überarbeitet, so dass der Namensraum übereinstimmt.
Irgendwelche Ideen/Optionen?
Während diese sehr gute Arbeit geleistet, ich will nicht, dass es so zu tun. Wie auch immer, ich fand heraus, dass durch das Erstellen des Shiny 'namespace' in der globalen Umgebung und das Einfügen von' paste' zum Verknüpfen der Javascript-Link der richtige Weg ist. Nicht glücklich mit dem Hacky-Code, aber scheint den Trick zu machen. 'ns <- NS ('myUI')'; Dann, 'on_click_js = einfügen (" Shiny.onInputChange ('", ns (' meinLinkName '),' ','% s '); $ (' # myModal '). Modal (' show ')", sep = " ")' – Gopala
Sehr nützlich für mich. Aber es funktioniert nicht, wenn Sie zweimal auf dieselbe Schaltfläche klicken. Da der Wert nicht aktualisiert wird, gibt es nichts, was das angezeigte Modal auslöst. –