【发布时间】:2020-12-28 17:55:30
【问题描述】:
我的应用程序有几个屏幕,我使用tabsetPanel() 处理它,隐藏选项卡标题(我
让它们在此处可见以进行调试)并使用updateTabsetPanel()选择它们
它从主屏幕开始(编码为mod_home_ui() / mod_home_server())
你按下一个按钮来触发一个动作,会有几个但我在这里只留下一个,叫做“学习”(编码为mod_learn_ui()/mod_learn_server())
“学习”模块本身包含游戏,这里我只留下了两个游戏,为了简单起见,两个游戏都使用了相同的模块功能。
一个反应值panel_flag,决定了应该玩哪个游戏,这里我强制它为FALSE,这意味着应该玩游戏2。
这最后一步没有像我预期的那样工作,而消息显示代码通过了正确的updateTabsetPanel() 调用,没有选择预期的选项卡,而且预期的文本没有显示在顶部屏幕。
这看起来像是一个命名空间问题,但我不明白我在这里做错了什么。
可以一次性复制粘贴下面的代码来运行应用程序,这是会发生什么的 gif 图像:
# main ui and server
app_ui <- function() {
tagList(
fluidPage(
title = "My app",
tabsetPanel(
id = "switcher",
#type = "hidden",
selected = "home",
tabPanel("home", mod_home_ui("home_ui")),
tabPanel("learn", mod_learn_ui("learn_ui"))
)
)
)
}
app_server <- function(input, output,session) {
learn <- callModule(mod_home_server, "home_ui")
observeEvent(learn(), {
message("In app_server: observeEvent on learn() to switch to 'learn' panel")
updateTabsetPanel(session, "switcher", selected = "learn")
})
callModule(mod_learn_server, "home_ui", learn = learn)
}
# home module
mod_home_ui <- function(id){
ns <- NS(id)
tagList(
textOutput(ns("some_text")),
actionButton(ns("learn"), "learn")
)
}
mod_home_server <- function(input, output, session){
output$some_text <- renderText("I expect clicking on the above to trigger game2, not game1")
ns <- session$ns
reactive({
res <- req(input$learn)
message(
'In mod_home_server: returning req(input$learn) in mod_home_server to trigger learn()')
res
})
}
# learn module
mod_learn_ui <- function(id){
ns <- NS(id)
tabsetPanel(
id = ns("switcher"),
#type = "hidden",
tabPanel("game1", mod_game_ui(ns("game1_ui"))),
tabPanel("game2", mod_game_ui(ns("game2_ui")))
)
}
mod_learn_server <- function(input, output, session, learn){
ns <- session$ns
panel_flag <- eventReactive(learn(), {
message('In mod_learn_server: eventReactive on learn() to trigger relevant game')
# in reality this would be computed or random
FALSE
})
observeEvent(panel_flag(), {
message('In mod_learn_server: observeEvent on panel_flag()')
if (panel_flag()) {
message('In mod_learn_server: select "game1" panel')
updateTabsetPanel(session, "switcher", selected = "game1")
} else {
message('In mod_learn_server: select "game2" panel')
updateTabsetPanel(session, "switcher", selected = "game2")
}
})
callModule(mod_game_server, "game1_ui")
callModule(mod_game_server, "game2_ui")
}
# game module
mod_game_ui <- function(id){
ns <- NS(id)
tagList(
textOutput(ns("some_text")),
"I expect another line of text above this one"
)
}
mod_game_server <- function(input, output, session){
ns <- session$ns
output$some_text <- renderText("I expect this to be shown")
}
library(shiny)
shinyApp(app_ui, app_server)
【问题讨论】:
-
app_server 中 mod_learn_server 的模块 ID 错误?
-
谢谢@Victorp! YBS也在下面回答。您对如何避免或调试这些问题有任何提示吗?
标签: r shiny shiny-reactivity