r - 如何在改变一秒时重置一个sliderInput而不触发Shiny中的反应
问题描述
如果这个问题有一个微不足道的答案,我深表歉意,而且我对 Shiny 的有限了解在我广泛寻找答案的过程中导致我走错了路。
我正在尝试解决以下问题。我有一个依赖于两个滑块输入来创建绘图的输出。滑块依次相互依赖,因为每次第一个滑块的值更改时,第二个滑块的状态都应重置。我目前实现这一点的尝试如下:
library(shiny)
library(plotly)
library(ggplot2)
ui <- fluidPage(
titlePanel("Test"),
sidebarLayout(
sidebarPanel(
sliderInput("slider1", "Slider1:", min = 0, max = 100, value = 0, step= 0.1),
sliderInput("slider2", "Slider2:", min = 0, max = 100, value = 0, step= 0.1)
),
mainPanel(
plotlyOutput('plot', height = 600)
)
)
)
server <- function(input, output, session) {
#temporary state storage.
slider1.state <- reactiveVal(-1)
counter <- reactiveVal(0)
output$plot <- renderPlotly({
print(paste("Function Call Number ", isolate(counter()) ))
counter(isolate(counter())+1)
#Only reset Slider2 if Slider1 has been changed
if (isolate(slider1.state()) != input$slider1) {
#this triggers a redraw
updateSliderInput(session, "slider2", value=0 )
}
ylim_max = input$slider2
#set the new values of the sliders
slider1.state(input$slider1)
ggplot(data.frame()) + geom_point() + xlim(0, input$slider1) + ylim(0, ylim_max)
})
}
shinyApp(ui, server)
我正在使用响应值来存储 的状态,并且仅在更改时才使用slider1
重置。然而,我面临的问题是调用第二次触发该函数,因此不必要地计算和重绘第二次的绘图。slider2
updateSliderInput
slider1
updateSliderInput
renderPlotly
我试图找到一种解决方案,使我能够以某种方式更新sliderInput而不触发事件,但无济于事。有没有一种优雅的方式来获得这种行为?理想情况下,我正在寻找一种可以应用于任意输入的解决方案。
在这件事上的任何帮助将不胜感激。谢谢!
解决方案
您可以使用debounce()
以避免不必要的更新:
library(shiny)
library(plotly)
library(ggplot2)
ui <- fluidPage(
titlePanel("Test"),
sidebarLayout(
sidebarPanel(
sliderInput("slider1", "Slider1:", min = 0, max = 100, value = 0, step= 0.1),
sliderInput("slider2", "Slider2:", min = 0, max = 100, value = 0, step= 0.1)
),
mainPanel(
plotlyOutput('plot', height = 600)
)
)
)
server <- function(input, output, session) {
observeEvent(input$slider1, {
updateSliderInput(session, "slider2", value=0 )
})
plot_limits <- reactive({
list(xlim_max = input$slider1, ylim_max = input$slider2)
})
plot_limits_d <- plot_limits %>% debounce(500)
counter <- reactiveVal(0)
output$plot <- renderPlotly({
print(paste("Function Call Number ", isolate(counter()) ))
counter(isolate(counter())+1)
ggplot(data.frame()) + geom_point() + xlim(0, plot_limits_d()$xlim_max) + ylim(0, plot_limits_d()$ylim_max)
})
}
shinyApp(ui, server)
推荐阅读
- javascript - FaceDetector 的检测方法未在 Chrome 中检测人脸
- python - 触发 python azure 函数从密钥库获取秘密
- powerbi - 有没有办法从自定义连接器添加度量?
- python - Python从嵌套列表中删除换行符
- angular7 - 如何在 ag 网格中一次只编辑一行?角7
- awk - 如何使用awk将第一列和第二列的第一行打印为单列?
- android - 列表未显示在 onChangedof 视图模型下
- azure - 如何在流量管理器端点中添加虚拟规模集实例 IP
- c++ - c ++ cmake(将windows转换为平台独立)WinExec to execute_process
- python - 在python中汇总分组的日期时间数据