我希望能够使用shinyjs显示和隐藏来切换UI的各个部分。我需要从模块内部访问模块外部的UI部分。这个是可能的吗?
请参阅附加的应用程序代码。主服务器代码中的“显示/隐藏”按钮可以工作,但模块中的按钮不能工作。
谢谢你的建议。
exampleUI <- function(id) {
ns <- NS(id)
tagList(actionButton(ns("hide_id"), "Module - Hide divs"),
actionButton(ns("show_id"), "Module - Show divs"),
uiOutput(ns("plot_id")))
}
shinyUI(fluidPage(
shinyjs::useShinyjs(),
shinyjs::hidden(tags$div(id = "hidden", "hidden")),
tags$div(id = "shown", "shown"),
actionButton("hide_id", "Hide divs"),
actionButton("show_id", "Show divs"),
exampleUI("eg")))
example <- function(input, output, session)
{
ns <- session$ns
observeEvent(input$hide_id,
{
shinyjs::hide("hidden")
shinyjs::hide("shown")
})
observeEvent(input$show_id,
{
shinyjs::show("hidden")
shinyjs::show("shown")
})
}
shinyServer(function(input, output) {
callModule(example, "eg")
observeEvent(input$hide_id,
{
shinyjs::hide("hidden")
shinyjs::hide("shown")
})
observeEvent(input$show_id,
{
shinyjs::show("hidden")
shinyjs::show("shown")
})
})发布于 2021-01-31 15:10:06
在第1.1版(2020年1月)出来之前,这是不可能的。在该版本中引入了参数asis。我引述如下:
当
asis=TRUE时,当在模块内时,ID将不会被命名空间。
下面是经过修改的asker代码的reprex,展示了它是如何工作的:
library(shiny)
library(shinyjs)
exampleUI <- function(id) {
ns <- NS(id)
tagList(actionButton(ns("hide_id"), "Module - Hide divs"),
actionButton(ns("show_id"), "Module - Show divs"),
uiOutput(ns("plot_id")))
}
example <- function(input, output, session)
{
ns <- session$ns
observeEvent(input$hide_id, {
shinyjs::hide("hidden", asis = TRUE)
shinyjs::hide("shown", asis = TRUE)
shinyjs::hide("plot_id")
})
observeEvent(input$show_id, {
shinyjs::show("hidden", asis = TRUE)
shinyjs::show("shown", asis = TRUE)
shinyjs::show("plot_id")
})
output$plot_id <- renderUI({
"This is the module calling ..."
})
}
UI <- function() {
fluidPage(
shinyjs::useShinyjs(),
shinyjs::hidden(tags$div(id = "hidden", "hidden")),
tags$div(id = "shown", "shown"),
actionButton("hide_id", "Hide divs"),
actionButton("show_id", "Show divs"),
exampleUI("eg"))
}
server <- function(input, output, session) {
callModule(example, "eg")
observeEvent(input$hide_id, {
shinyjs::hide("hidden")
shinyjs::hide("shown")
})
observeEvent(input$show_id, {
shinyjs::show("hidden")
shinyjs::show("shown")
})
}
shinyApp(UI, server)https://stackoverflow.com/questions/45560947
复制相似问题