我想要一个用于快速、可视化输入的滑块,但也需要一个用于精确计算的相应数字输入。我已设法将滑块绑定value到input$,因此它们将遵循数字输入中写入的内容。但是,我似乎无法让它以相反的方式工作。
用户界面
numericInput("num_l",
label = "Beam length in m.",
value = 10),
numericInput("num_a",
label = "Choose position, where to apply force, starting from left, in m.",
value = input$slider_a), # THIS DOESN'T WORK
numericInput("num_x",
label = "Calculate the deflection, at position starting from left, in m.",
value = input$slider_x), # NEITHER DOES THIS
Run Code Online (Sandbox Code Playgroud)
服务器
output$slider <- renderUI({
tagList( # Need this for multiple reactive sliders
sliderInput("slider_a",
label = "Load force position:",
min = 0,
max = input$num_l,
value = input$num_a, # THIS WORKS
step = 0.1),
sliderInput("slider_x",
label = "Deflection calculation position:",
min = 0,
max = input$num_l,
value = input$num_x, # THIS ALSO WORKS
step = 0.1)
)
})
Run Code Online (Sandbox Code Playgroud)
使用更新函数:
ui <- fluidPage(
numericInput("num_i",
label = "my input:",
value = 4,
min = 0,
max = 10),
sliderInput("num_s",
label = "my slider:",
value = 4,
min = 0,
max = 10)
)
server <- function(output, input, session){
observe({
updateSliderInput(
session = session,
inputId = "num_s",
value = input$num_i
)
})
observe({
updateSliderInput(
session = session,
inputId = "num_i",
value = input$num_s
)
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
但是,它可能会导致一些问题,因为数字输入的更新会触发滑块的更新,反之亦然。我注意到人们可能会遇到无限循环。我不知道如何解决这个问题,所以我将等待更高级的闪亮开发人员的其他答案。
该问题的可能解决方案之一如下:使用 jQuery 函数更新输入控件。使用服务器端的标准观察者更新滑块。但是,使用 jQuery 更新控件不会反映在服务器上,更新仅在客户端(Web 浏览器)中生效。这似乎不是问题,因为您可以跟踪滑块并在应用程序代码中使用它的值。第二个控件仅用于显示目的。
因此,编写一个像这样的 jQuery 函数:
$('document').ready(function(){
$('#num_s').change(function(){
var new_val = $(this).val();
$('#num_i').val(new_val);
});
});
Run Code Online (Sandbox Code Playgroud)
将其保存在 www 文件夹中,然后使用 includeScript() 将文件包含在您的应用程序中。