moduleServer
而不是callModule
.moduleServer
(与 不同callModule
)。moduleServer
,以便我可以正确引用父会话,以便updateTabsetPanel
在renderUI
动态输出中正常工作。这篇文章演示了如何使用callModule
将父会话传递到模块中,以便updateTabsetPanel
可以引用父会话并相应地更新它。我使用这种方法在这里创建了一个最小的例子。有两个tabPanel
s,我们试图通过第一个actionLink
中的an 导航到第二个。该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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句