我正在使用软件包Shiny.router在两个页面之间重定向导航。当我通过单击浏览器的后退按钮或使用change_page()函数返回上一页,然后再次移至当前页面时,将额外触发一次watchEvent和eventReactive函数。
我试图用Javascript和功能onbeforeunload
捕获浏览器后退按钮的点击,但是至少在Chrome中这根本不起作用。
我提供了一个最小的示例,该示例包含Shiny.router教程页面中的示例,并对其进行了扩展以包括selectInput控件。如果您返回首页,然后再次返回首页,并从selectInput控件中选择一个元素,则会额外触发watchEvent函数。如果再次执行此操作,该函数将被触发3次,依此类推。
我正在使用Shiny.router版本:0.1.1,Shiny版本:1.3.2和google chrome 75.0.3770.100
library(shiny)
library(shiny.router)
menu <- (
tags$ul(
tags$li(a(class = "item", href = route_link("home"), "Home page")),
tags$li(a(class = "item", href = route_link("side"), "Side page"))
)
)
page <- function(title, content) {
div(
menu,
titlePanel(title),
p(content),
actionButton("switch_page", "Click to switch page!")
)
}
my_page<-function(){
div(
uiOutput("my_dropdown_list")
)}
home_page <- page("Home page", uiOutput("current_page"))
side_page <- my_page()
my_page_server <- function(input, output, session) {
observeEvent(input$my_dropdown_list,{
cat(paste0("selected element ", input$my_dropdown_list, "\n"))
}, ignoreInit=TRUE, ignoreNULL=TRUE)
output$my_dropdown_list <- renderUI({
selectInput("my_dropdown_list","Choices:",
choices= c("A","B", "C"),
multiple=FALSE,
selectize=TRUE
)
})
}
router <- make_router(
route("home", home_page, NA),
route("side", side_page, my_page_server)
)
ui <- shinyUI(fluidPage(
router_ui()
))
server <- shinyServer(function(input, output, session) {
router(input, output, session)
output$current_page <- renderText({
page <- get_page(session)
sprintf("Welcome on %s page!", page)
})
observeEvent(input$switch_page, {
if (is_page("home")) {
change_page("side")
} else if (is_page("side")) {
change_page("home")
}
})
})
shinyApp(ui, server)
在页面之间重定向时,如何避免这些额外的watchEvent和eventReactive触发器?