#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)