Применение строки запроса в Shiny к Реактивному значению и Заполнение выборок

#r #shiny #query-string

#r #блестящий #строка запроса

Вопрос:

У меня есть сложное приложение shinydashboard с множеством динамических частей. На нужной мне странице пользователь может выбрать переключатель и выбрать ввод. Радиовход изменяет параметры ввода selectinput, а значение ввода select заполняет содержимое этой страницы. Я пытаюсь добавить функциональность строки запроса, в которой пользователь может перейти непосредственно на эту конкретную вкладку, а значения радиобуттона и selectinput заполняются из строки запроса. Кроме того, я хочу иметь возможность переходить по ссылкам между страницами и обратно, что также будет автоматически заполнять входные данные.

Для достижения этой цели я использую reactiveVal, в котором хранится значение параметра selectInput, которое я хочу выбрать, например, путем извлечения значения из строки запроса или значения динамически выбранного значения из таблицы.

Я создал репрезентацию проблемы ниже. Когда я применяю строку запроса ?категория=буквы и выберите=c , она заполняет выбранные параметры так, как я этого хочу. Однако сейчас я не могу изменить значение радио. Если я попытаюсь, он просто вернется к параметрам из строки запроса. Таким образом, в этом примере я могу потерять другие буквы, но я не могу переключить радио на цифры и выбрать номер.

Как я могу исправить это, чтобы не мешать другим функциям и создать рабочую строку запроса, которая правильно заполняет значения?

 library(shiny) library(shinydashboard) library(tidyverse) library(DT)  ui lt;- dashboardPage(  dashboardHeader(title = "Testing Query String"),  #dashboard sidebar-----  dashboardSidebar(  sidebarMenu(id = "tabs",  menuItem("Home", tabName = "home_tab"),  menuItem("Desired Page", tabName = "goHere")  )  ),  #dashboard Body ----  dashboardBody(  tabItems(  #Home page-----  tabItem(tabName = "home_tab",  fluidPage(  fluidRow(h2("Home Page")),  fluidRow(dataTableOutput("table"))  )  ),  #Raw Table page ----  tabItem(tabName = "goHere",  fluidPage(  fluidRow(h2("Desired Page"),  p("I want to set the below options based on query string.")),  fluidRow(  column(3,  radioButtons("radioChoice",  label = "This selection affects the drop down:",  choices = c("numbers", "letters", "months"))  ),  column(4,  selectInput('selectChoice', label = 'Choose an item',  choices = c())  )  )  ))  )))  server lt;- function(input, output, session) {    output$table lt;- renderDataTable({  DT::datatable(data.frame(`Pick one` = c("6", "m", "July")),  rownames = F, selection = 'single',  options = list(dom = 't', pageLength = 5)) %gt;%  formatStyle(c(1), cursor = "pointer")  })    observeEvent(input$table_cell_clicked, {  info = input$table_cell_clicked  # do nothing if not clicked yet, or the clicked cell is not in the 1st column  if (is.null(info$value) || info$col != 0) return()    changingSelected(info$value)    #change radio selection  if(changingSelected() %in% c(1:9)) {  updateRadioButtons(session, "radioChoice", selected = 'numbers')  } else if(changingSelected() %in% letters) {  updateRadioButtons(session, "radioChoice", selected = 'letters')  } else if(changingSelected() %in% month.name) {  updateRadioButtons(session, "radioChoice", selected = 'months')  }     #update the selected option  updateSelectInput(session, 'selectChoice', selected = info$value)    updateTabItems(session, 'tabs', selected = 'goHere')  })    #Dynamically Change the DropDown menu  changingSelected lt;- reactiveVal("")  observeEvent(input$radioChoice, {  #no value to reactive value   numbers selected  if(input$radioChoice == 'numbers' amp; changingSelected()=="") {  updateSelectInput(session, 'selectChoice', choices=c(1:9))  #reactive value provided   numbers selected  } else if(input$radioChoice == 'numbers' amp; changingSelected()!="") {  updateSelectInput(session, 'selectChoice', choices=c(1:9),  selected = changingSelected())  #no value to reactive value   letters selected  } else if(input$radioChoice == 'letters' amp; changingSelected()=="") {  updateSelectInput(session, 'selectChoice',  choices=letters)  #reactive value provided   letters selected  } else if(input$radioChoice == 'letters' amp; changingSelected()!="") {  updateSelectInput(session, 'selectChoice',  choices=letters,  selected = changingSelected())  #no value to reactive value   months selected  } else if(input$radioChoice == 'months' amp; changingSelected()=="") {  updateSelectInput(session, 'selectChoice',  choices=month.name)  #reactive value provided   months selected  } else if(input$radioChoice == 'months' amp; changingSelected()!="") {  updateSelectInput(session, 'selectChoice',  choices=month.name,  selected = changingSelected())  }  #reset reactive value  changingSelected("")  })      observe({  query lt;- parseQueryString(session$clientData$url_search)  if(!is.null(query$category) amp; !is.null(query$select)) {  changingSelected(query$select)  updateTabItems(session, 'tabs', selected = 'goHere')  updateRadioButtons(session, 'radioChoice', selected = query$category)  updateSelectInput(session, 'selectChoice', selected = changingSelected())  }  })     }  # Run the application shinyApp(ui = ui, server = server)