R语言 如何从一个闪亮的模块在主界面中动态显示通知?

sqyvllje  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(143)

我正在使用Shiny创建一个Web应用程序,遇到了一个与管理来自Shiny模块的通知相关的问题。我的目标是在我的应用程序的主UI中动态显示通知,基于来自Shiny模块的操作或值,但我发现要顺利实现这一功能具有挑战性。
下面是我的代码的简化摘录:

library(shiny)

notifUI <- function(id) {
  ns <- NS(id)
  tagList(
  actionButton(ns("show_notif"), "Show Notification")
  )
}

ui <- fluidPage(
  notifUI("notifModule"),
  uiOutput("notification")
)

notifServer <- function(input, output, session) {
  observeEvent(input$show_notif, {
    output$notification <- renderUI({
      # Example code to display the notification
      tags$div(
        id = "notif_div",
        class = "alert alert-warning",
        "This is a notification message."
      )
    })
  })
}

server <- function(input, output, session) {
  callModule(notifServer, "notifModule")
}

shinyApp(ui, server)

如何动态地将消息从模块传递到主服务器以显示为通知?
是否有一种方法或特定的软件包,将促进管理通知在此配置与闪亮的模块?
任何帮助或指导将不胜感激。
提前感谢您

jq6vz3qz

jq6vz3qz1#

这是一个完整的解决方案,基于我上面的评论。它比OP简单,因为它不需要向模块服务器传递额外的参数,所以通信只是从模块到主应用程序,而不是双向的。

testUI <- function(id) {
  ns <- NS(id)
  actionButton(ns("send"), "Send notification")
}

testServer <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {
      rv <- reactiveValues(message = NA)
      
      observeEvent(input$send, {
        rv$message <- paste0("Your random number is ", runif(1))
      })
      
      reactive({ rv$message })
    }
  )
}

ui <- fluidPage(
  testUI("test"),
  textOutput("moduleMessage")
)

# Main app server
server <- function(input, output, session) {
  msg <- testServer("test")
  
  output$moduleMessage <- renderText({
    req(msg())
    
    msg()
  })
}

shinyApp(ui, server)
fcipmucu

fcipmucu2#

我已经设法找到了一个解决方案,感谢在正确的方向从利米轻推!
以下是我提出的工作解决方案:

library(shiny)

# Module UI
notifUI <- function(id) {
  ns <- NS(id)
  tagList(
    actionButton(ns("show_notif"), "Show Notification")
  )
}

# Module Server
notifServer <- function(input, output, session, notifMessage) {
  observeEvent(input$show_notif, {
    notifMessage("This is a notification message from the module.")
  })
}

# Main UI
ui <- fluidPage(
  uiOutput("notification"),
  notifUI("notifModule")
)

# Main Server
server <- function(input, output, session) {
  # Reactive value to store the notification message
  notifMessage <- reactiveVal(NULL)

  # Call module with notifMessage as a parameter
  callModule(notifServer, "notifModule", notifMessage)

  # Observe notifMessage and if changed, render the notification UI
  output$notification <- renderUI({
    if (!is.null(notifMessage())) {
      tags$div(
        id = "notif_div",
        class = "alert alert-warning",
        notifMessage()
      )
    }
  })
}

shinyApp(ui, server)

此方法允许模块设置通知消息,然后由主服务器函数观察,当单击模块UI内的按钮时,触发UI更新新的通知消息。
再次感谢Limey为我指明了正确的方向,我希望这可以帮助其他人在未来面临类似的问题!

相关问题