moduleServer
而不是 callModule
. moduleServer
(与 callModule
不同)。 moduleServer
,以便我可以正确引用父 session 以获取 updateTabsetPanel
在 renderUI
内正常工作动态输出。 This post演示如何使用
callModule
将父 session 传递到模块中,以便 updateTabsetPanel
可以引用父 session 并相应地更新它。我使用这种方法在这里创建了一个最小的示例。有两个tabPanel
s,我们正试图通过 actionLink
导航到第二个在第一个。 first_server
使用 callModule
调用模块,并且我们能够将父 session 参数作为附加参数传递,允许我们在 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
一起工作.我的最佳猜测是将父 session 一直传递到 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
时会产生错误我不完全理解:Warning: Error in updateTabsetPanel: promise already under evaluation: recursive default argument reference or earlier problems?
感谢您的阅读和任何建议。
最佳答案
删除 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)
关于r - 在 R Shiny 应用程序 : accessing parent environment for updateTabsetPanel 中将附加参数传递给 moduleServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67978609/