Вот простое приложение, в котором пользователь может либо ввести (numericInput, bpm_numeric), либо вставить (sliderInput, bpm_slider) входное значение. Оба эти элемента пользовательского интерфейса должны синхронизироваться с любым из них. Однако вывод нужно отслеживать только один раз. Ниже я отслеживаю его дважды, но мне нужна только одна копия «выбора / ввода» от пользователя. Я думаю, что мне нужно использовать reactiveValues
, но я не уверен в подходе.
library(shiny)
ui <- fluidPage(
titlePanel("Reverb & Delay Calculator"),
sidebarLayout(
sidebarPanel(
uiOutput("bpm_numeric"),
uiOutput("bpm_slider")
),
mainPanel(
p("Numeric value is:"),
verbatimTextOutput("numeric_val"),
p("Slider value is:"),
verbatimTextOutput("slider_val")
)
)
)
server <- function(input, output, session) {
output$bpm_numeric = renderUI({
numericInput(
"bpm_numeric",
"BPM Numeric",
value = 60, min = 40, max = 300
)
})
output$bpm_slider = renderUI({
sliderInput(
"bpm_slider",
"BPM Slider",
value = 60, min = 40, max = 300
)
})
# See how I can track "both", but really I only need to track "one" since
# they should stay in-sync with one another. Maybe reactiveValues???
output$numeric_val <- renderText({ input$bpm_numeric })
output$slider_val <- renderText({ input$bpm_slider })
observeEvent(input$bpm_numeric, {
val = input$bpm_numeric
updateSliderInput(session, "bpm_slider", value = val)
})
observeEvent(input$bpm_slider, {
val = input$bpm_slider
updateNumericInput(session, "bpm_numeric", value = val)
})
}
shinyApp(ui = ui, server = server)
![Shiny App](https://i.stack.imgur.com/PWoih.gif)
ПРИМЕЧАНИЕ. Хотя в настоящее время я использую uiOuput()
+ renderUI()
+ update___Input()
, это необязательно. Я открыт для других подходов, при условии, что входной интерфейс остается в синхронизации У меня есть одна копия синхронизированного вывода.