在 R Shiny 应用程序中将附加参数传递给 moduleServer:访问 updateTabsetPanel 的父环境

问题描述 投票:0回答:1
  • 从 Shiny 1.5.0 开始,我们鼓励使用
    moduleServer
    而不是
    callModule
  • 但是,我们似乎无法将其他参数传递给
    moduleServer
    (与
    callModule
    不同)。
  • 这是一个问题,因为我想将父会话作为参数传递给
    moduleServer
    ,以便我可以正确引用父会话,以便
    updateTabsetPanel
    renderUI
    动态输出中正常工作。

这篇文章演示了如何使用

callModule
将父会话传递到模块中,以便
updateTabsetPanel
可以引用父会话并相应地更新它。我在这里使用这种方法创建了一个最小的示例。有两个
tabPanel
,我们尝试通过第一个中的
actionLink
导航到第二个。
first_server
模块是用
callModule
调用的,我们可以将父会话参数作为附加参数传递,从而允许我们在
updateTabsetPanel
中的
first_server
调用中引用它。单击
actionLink
然后将我们带到第二个模块 UI,如预期的那样:

library(shiny)

first_ui <- function(id) {
    ns <- NS(id)
    uiOutput(ns("goto_second_link_ui"))
}

second_ui <- function(id) {
    ns <- NS(id)
    p("It worked!")
}

first_server <- function(input, output, session, parent) {
    output$goto_second_link_ui <- renderUI({
        actionLink(session$ns("goto_second"), label = "Go to second module")
    })
    observeEvent(input$goto_second, {
        updateTabsetPanel(parent,
            inputId = "main",
            selected = "second"
        )
    })
}

ui <- {
    fluidPage(
        tabsetPanel(id = "main",
            tabPanel(value = "first",
                title = "First module",
                first_ui("first")    
            ),
            tabPanel(value = "second",
                title = "Second module",
                second_ui("second")    
            )
        )
    )
}

server <- function(input, output, session) {
    callModule(first_server, id = "first", parent = session)
}

shinyApp(ui, server)

我尝试了几种方法来让它与

moduleServer
一起工作。我最好的猜测是将父会话一直传递到
module
moduleServer
参数(仅显示相关更改):

first_server <- function(id, parent) {
    moduleServer(id, function(input, output, session, parent = parent) {
        output$goto_second_link_ui <- renderUI({
            actionLink(session$ns("goto_second"), label = "Go to second module")
        })
        observeEvent(input$goto_second, {
            updateTabsetPanel(parent,
                inputId = "main",
                selected = "second"
            )
        })
    })
}

server <- function(input, output, session) {
    first_server("first", parent = session)
}

当我单击我不完全理解的

actionLink
时,会生成错误:

警告:updateTabsetPanel 中出现错误:promise 已在评估中:递归默认参数引用或早期问题?

感谢您的阅读和任何建议。

r shiny shinymodules
1个回答
9
投票

一旦删除

moduleServer
中的额外参数,它就可以工作。试试这个

library(shiny)

first_ui <- function(id) {
  ns <- NS(id)
  uiOutput(ns("goto_second_link_ui"))
}

second_ui <- function(id) {
  ns <- NS(id)
  p("It worked!")
}

first_server <- function(id,parent) {
  moduleServer(id, function(input, output, session) {
    ns <- session$ns
    output$goto_second_link_ui <- renderUI({
      actionLink(ns("goto_second"), label = "Go to second module")
    })
    observeEvent(input$goto_second, {
      updateTabsetPanel(parent,
                        inputId = "main",
                        selected = "second"
      )
    })
  })
}

ui <- {
  fluidPage(
    tabsetPanel(id = "main",
                tabPanel(value = "first",
                         title = "First module",
                         first_ui("first")    
                ),
                tabPanel(value = "second",
                         title = "Second module",
                         second_ui("second")    
                )
    )
  )
}

server <- function(input, output, session) {
  first_server("first", parent = session)
}

shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.