R Shiny - Обновление сеанса приложения (inyjs.reset) при переходе на конкретную вкладку navbarPage - PullRequest
0 голосов
/ 25 января 2019

Мое приложение проходит через ряд панелей, где пользователь может перейти к следующей панели, нажав кнопку действия.Я бы хотел, чтобы все приложение обновлялось при переходе на другую вкладку.Это означает, что пользователь начнёт сначала с серии панелей, и все входные данные виджета будут сброшены.

Я предоставил панелям идентификаторы и пытаюсь обновить приложение, используя

    shinyjs.reset = function() {history.go(0)}

в

    observeEvent()

Я также попытался сбросить используемые входыв условной панели выбора и связанных входных данных виджета.Ни один из этих подходов не обновляет приложение.

library(shiny)
library(shinyjs)

#### Specify the number of pages to use 
NUM_PAGES <- 2

# Define the js method that resets the page 
jsResetCode <- "shinyjs.reset = function() {history.go(0)}"  


# UI
ui <- navbarPage(

  # Call shinyjs
  useShinyjs(),                                          
  extendShinyjs(text = jsResetCode),

  ### Panel 1 ### 
  tabPanel(id = "p1",
           title = "A",
           "Page 1"),

  ### Panel 2 ### 
  tabPanel(id = "p2",
           title = "B",
           div(id = "form",

               ### Sub-panel 1
               conditionalPanel(
                 condition = "input.nextBtn_1 == 0",
                 radioButtons(inputId ="Q1", ("Q1"), choices = c("A", "B"), 
                              selected = character(0)),

                 # Next page button 
                 div(actionButton("nextBtn_1", "Next1 >"))),

               ### Sub-panel 1
               conditionalPanel(
                 # Q1
                 condition = "input.nextBtn_1 == 1 && input.nextBtn_2 == 0",
                 radioButtons(inputId ="Q2", ("Q2"),
                              choices = c("A", "B" , "C"), 
                              selected = character(0)),
                 # Q2
                 radioButtons(inputId ="Q3", ("Q3"),
                              choices = c("A", "B"), 
                              selected = character(0)),

                 # Next page button 
                 div(actionButton("nextBtn_2", "Next2 >")))
           )))


# Server
server <- function(input, output) {

  # Observe event 
      observeEvent(input$p1, {js$reset()})

  # The function for adding the page value
  navPage <- function(input, direction) {
    input <- input + direction
   }

  # When nextBtn is pressed, one is added to page number
  observeEvent(input$nextBtn_1, navPage(input$nextBtn_1, 1))# navPage(1)
  observeEvent(input$nextBtn_2, navPage(input$nextBtn_2, 1))# navPage(1)

}

# run 
shinyApp(server = server, ui = ui)

Я ожидаю, что когда пользователь нажимает на вкладку "p1", приложение обновляется.Когда пользователь затем возвращается обратно к «p2», они начнутся на первой панели, и для виджетов ввод не будет определен.

1 Ответ

0 голосов
/ 26 января 2019

Проблема в том, что input$p1 не существует. Чтобы узнать, когда нажата вкладка и какая вкладка нажата, вам нужно присвоить id контейнеру вкладок и использовать этот идентификатор в качестве входных данных. Кроме того, вы упоминаете, что хотите сбросить, но код, который вы используете очень жесткий сброс - он обновляет страницу, это буквально эквивалентно нажатию кнопки Обновить. Я не совсем понимаю, как должна работать логика, которую вы хотите (каждый раз, когда вы нажимаете на вкладку 2, приложение обновляется, и вы возвращаетесь на вкладку 1 - это означает, что вы никогда не сможете перейти на вкладку 2!), Но в любом случае вот что это будет выглядеть так:

library(shiny)
library(shinyjs)

#### Specify the number of pages to use 
NUM_PAGES <- 2

# Define the js method that resets the page 
jsResetCode <- "shinyjs.reset = function() {history.go(0)}"  


# UI
ui <- navbarPage(
  id = "mytabs",

  # Call shinyjs
  useShinyjs(),
  extendShinyjs(text = jsResetCode, functions = "reset"),

  ### Panel 1 ### 
  tabPanel(id = "p1",
           title = "A",
           "Page 1"),

  ### Panel 2 ### 
  tabPanel(id = "p2",
           title = "B",
           div(id = "form",

               ### Sub-panel 1
               conditionalPanel(
                 condition = "input.nextBtn_1 == 0",
                 radioButtons(inputId ="Q1", ("Q1"), choices = c("A", "B"), 
                              selected = character(0)),

                 # Next page button 
                 div(actionButton("nextBtn_1", "Next1 >"))),

               ### Sub-panel 1
               conditionalPanel(
                 # Q1
                 condition = "input.nextBtn_1 == 1 && input.nextBtn_2 == 0",
                 radioButtons(inputId ="Q2", ("Q2"),
                              choices = c("A", "B" , "C"), 
                              selected = character(0)),
                 # Q2
                 radioButtons(inputId ="Q3", ("Q3"),
                              choices = c("A", "B"), 
                              selected = character(0)),

                 # Next page button 
                 div(actionButton("nextBtn_2", "Next2 >")))
           )))


# Server
server <- function(input, output) {

  # Observe event 
  observeEvent(input$mytabs, {
    if (input$mytabs == "A") {
      print("tab 1 clicked")
    }
    if (input$mytabs == "B") {
      print("refreshing page")
      js$reset()
    }
  })

  # The function for adding the page value
  navPage <- function(input, direction) {
    input <- input + direction
  }

  # When nextBtn is pressed, one is added to page number
  observeEvent(input$nextBtn_1, navPage(input$nextBtn_1, 1))# navPage(1)
  observeEvent(input$nextBtn_2, navPage(input$nextBtn_2, 1))# navPage(1)

}

# run 
shinyApp(server = server, ui = ui)
...