同步 sliderInput 和 textInput [英] In sync sliderInput and textInput
问题描述
考虑以下闪亮的应用程序:
Consider the following shiny app:
library('shiny')
# User Interface/UI
ui <- fluidPage(
titlePanel(
'Slider and Text input update'
), # titlePanel
mainPanel(
# Slider input
sliderInput(
inputId = 'sliderValue',
label = 'Slider value',
min = 0,
max = 1000,
value = 500
), # sliderInput
# Text input
textInput(
inputId = 'textValue',
label = NULL
) # textInput
) # mainPanel
) # fluidPage
# Server logic
server <- function(input, output, session) {
observe({
# Update vertical depth text box with value of slider
updateTextInput(
session = session,
inputId = 'textValue',
value = input$sliderValue
) # updateTextInput
# updateSliderInput(
# session = session,
# inputId = 'sliderValue',
# value = input$textValue
# ) # updateSliderInput
}) # observe
}
# Run the application
shinyApp(ui = ui, server = server)
它允许用户更改滑块的值(sliderInput
),从而更新文本框中的文本(textInput
):
It allows the user to change the values of a slider (sliderInput
), which updates the text in the text box (textInput
):
我希望它们能够同步工作.所以,除了上面的滑块 > 文本框交互之外,我还想要相反的:文本框 > 滑块.
I want these to work in sync. So, instead of just the above slider > text box interaction, I want the opposite as well: text box > slider.
如果您取消注释 updateSliderInput
组件,这两个小部件将相互竞争;一个的更新导致另一个的更新导致另一个的更新,...
If you uncomment the updateSliderInput
component, the two widgets compete against one another; an update of the one leads to an update of the other which leads to an update of the other, ...
如何在保持两者同步的同时避免这种情况?
How can this be avoided while still making the two be in sync?
推荐答案
一种方法是对每个输入使用 observeEvent
并添加一个条件 if(as.numeric(input$textValue) != 输入$sliderValue)
.这将帮助您从输入中递归调用彼此更新函数.然后您的应用将如下所示:
One way to do it would be using observeEvent
for each input and adding a condition if(as.numeric(input$textValue) != input$sliderValue)
. This will help you from the inputs calling each others update functions recursively. Then your app would look something like this:
library('shiny')
# User Interface/UI
ui <- fluidPage(
titlePanel(
'Slider and Text input update'
), # titlePanel
mainPanel(
# Slider input
sliderInput(
inputId = 'sliderValue',
label = 'Slider value',
min = 0,
max = 1000,
value = 500
), # sliderInput
# Text input
textInput(
inputId = 'textValue',
value = 500,
label = NULL
) # textInput
) # mainPanel
) # fluidPage
# Server logic
server <- function(input, output, session)
{
observeEvent(input$textValue,{
if(as.numeric(input$textValue) != input$sliderValue)
{
updateSliderInput(
session = session,
inputId = 'sliderValue',
value = input$textValue
) # updateSliderInput
}#if
})
observeEvent(input$sliderValue,{
if(as.numeric(input$textValue) != input$sliderValue)
{
updateTextInput(
session = session,
inputId = 'textValue',
value = input$sliderValue
) # updateTextInput
}#if
})
}
# Run the application
shinyApp(ui = ui, server = server)
这篇关于同步 sliderInput 和 textInput的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!