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 已在评估中:递归默认参数引用或早期问题?
感谢您的阅读和任何建议。
一旦删除
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)