gpt4 book ai didi

r - 访问 Shiny 模块中的父命名空间

转载 作者:行者123 更新时间:2023-12-04 09:12:04 26 4
gpt4 key购买 nike

我正在尝试 updateSelectInput在子模块内的父命名空间中的 selectInput 上。在模块函数中,据我所知,我在命名空间内,因此我无法从父命名空间访问和更新 selectInput。我该如何解决这个问题?

library(shiny)
library(shinydashboard)

moduleUI <- function(id) {
ns <- NS(id)
box(
title=actionLink(ns("link"),"This is a link"),
plotOutput(ns("plot"))
)
}

module <- function(input, output,session,number) {
output$plot <- renderPlot({
plot(number)
})

observeEvent(input$link,{
print(paste0("Number is: ",number))
updateSelectInput(session,"selectInput",selected=number) #Doesn't work
})
}

ui <-
dashboardPage(
dashboardHeader(title="Title"),
dashboardSidebar(
selectInput("selectInput","Choose one option",choices=seq(1,10),selected=1)
),
dashboardBody(
moduleUI("5"),
moduleUI("10")
)
)

server <- function(session,input, output) {
callModule(module=module,id="5",5)
callModule(module=module,id="10",10)
}

shinyApp(ui = ui, server = server)

最佳答案

花了我一段时间,但我找到了一种让子模块更新 super 模块的方法。

Shiny 的设计使得对其他模块的访问必须通过模块参数或返回值来完成。我们不能在模块之间传递widget ID,但是我们可以传递父级的 session 信息。

library(shiny)

moduleUI <- function(id) {
ns <- NS(id)
uiOutput(ns("my_link"))
}

module <- function(input, output, session, number, parent) {
output$my_link <- renderUI({
actionLink(session$ns("link"), paste0("This is a link to ", number))
})

observeEvent(input$link,{
updateSelectInput(session = parent,"selectInput",selected = number) ### use parent session
})
}

ui <- fluidPage(
selectInput("selectInput","Choose one option",choices=seq(1,10),selected=1),
moduleUI("5"),
moduleUI("10")
)

server <- function(session,input, output) {
callModule(module = module, id = "5", 5, parent = session) ### pass session information
callModule(module = module, id = "10", 10, parent = session) ### pass session information
}

shinyApp(ui = ui, server = server)

特别注意:
  • 我们在调用子模块时传递当前 session 信息
  • 我们在更新输入选择器时使用父 session
  • 关于r - 访问 Shiny 模块中的父命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708815/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com