Как можно избежать дублирования функций наблюдающих событий и событий, связанных с событиями, при перенаправлении между блестящими страницами? - PullRequest
0 голосов
/ 11 июля 2019

Я использую пакет глянцевый.рутер для перенаправления навигации между двумя страницами. Когда я возвращаюсь на предыдущую страницу либо нажатием на кнопку «Назад» в браузере, либо с помощью функции change_page (), а затем снова перехожу на текущую страницу, функции наблюденияEvent и eventReactive запускаются в дополнительное время.

Я попытался зафиксировать нажатие кнопки назад браузера с помощью Javascript и функции onbeforeunload, но по крайней мере в Chrome это не работает вообще.

Я включил минимальный пример, который состоит из примера со страницы учебного руководства глянцевого.рутера, который я расширил, чтобы включить элемент управления selectInput. Если вы вернетесь на первую страницу, а затем снова на боковую страницу и выберете элемент из элемента управления selectInput, функция Наблюдение за событием будет запущено в течение дополнительного времени. Если вы сделаете это снова, функция будет запущена три раза и т. Д.

Я использую версию spark.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)

Как можно избежать этих дополнительных триггеров наблюдающих событий и событий, связанных с событиями, при перенаправлении между страницами?

...