我想以编程方式构建我的闪亮仪表板页面,并且还需要以编程方式更改显示的页面,例如成功登录后。我密切关注了?updateTabItems
中的示例,但是以某种方式似乎以编程方式生成内容时updateTabItems
无效。这是我的代码,按下登录按钮后没有显示page2。
# create ui that is created dynamically from server logic
ui <- dashboardPage(
dashboardHeader(title = "switch tabs"),
dashboardSidebar(sidebarMenu(sidebarMenuOutput("sidebarMenu"))),
dashboardBody(uiOutput("body"))
)
# build ui of login page
uiLogin = function(id) {
ns = NS(id)
actionButton( ns("loginButton"), "Login")
}
# server logic of login page
module = function(input, outpust, session) {
# observe login button
observeEvent(input$loginButton, {
updateTabItems(session, "sidebarID", selected = "loginTab")
cat("trying to switch tab\n")
})
}
# server logic
server <- function(input, output, session) {
# sidebar menu
output$sidebarMenu <- renderMenu({
sidebarMenu(
id="sidebarID",
menuItem("Login", tabName = "loginTab", selected=TRUE),
menuItem("Page 2", tabName = "page2")
)
})
# body
output$body <- renderUI(
tabItems(
tabItem(tabName="loginTab", uiLogin("loginPage")),
tabItem(tabName="page2", tags$h2("Page 2"))
)
)
# server logic of login page
callModule(module, "loginPage")
}
shinyApp(ui, server)
有趣的是,尽管在selected=TRUE
中设置了tabItem
,启动时甚至没有显示登录页面。我的闪亮版本为1.2.0,而闪亮仪表板位于0.7.1版本上。
我对如何以编程方式更新视图的任何建议深表赞赏?
答案 0 :(得分:2)
在(我的)闪亮应用程序中,问题经常出在名称空间中。将父会话传递到登录页面的模块
# server logic of login page
callModule(module, "loginPage", session)
并在适当的命名空间中更新选项卡项可以更改选项卡
# server logic of login page
module = function(input, output, session, parentSession) {
# observe login button
observeEvent(input$loginButton, {
updateTabItems(parentSession, "sidebarID", selected = "loginTab")
})
}
我没有意识到在?updateTabItems
中给出的示例中,边栏ID和模块位于相同的名称空间中,而在我的示例中该名称空间是不同的。