如何在更改第二个sliderInput时重置一个sliderInput而不触发Shiny中的反应

熵驱动

如果这个问题的答案很简单,我很抱歉,而我对Shiny的有限了解导致我在广泛寻找答案时走错了路。

我正在尝试解决以下问题。我有一个依赖于两个sliderInputs来创建绘图的输出。在每次第一个滑块的值更改时都应重置第二个滑块的状态的意义上,这些滑块又相互依赖。我目前为实现此目的的尝试如下:

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使用进行重置但是,我面临的这个问题是第二次调用函数,从而不必要地计算和重绘了第二次的绘图。updateSliderInputslider1updateSliderInputrenderPlotly

我试图找到一种解决方案,该解决方案可以使我在不触发事件的情况下以某种方式更新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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

phpMyAdmin在插入第一个表时执行触发器时,在第二个表中存储一个随机数

如何使用第二个Tkinter窗口在第一个中更改图像?

在第二个活动中单击一个按钮时,如何使用微调器更改主要活动的背景颜色?

如何在WPF中从第一个窗口打开第二个窗口?

合并两个Oservable,确保其中一个对第二个更改有反应

如果需要第一个功能,该如何在脚本中执行第二个功能?

如何触发第二个按钮以打开另一个模式

如何在第一个div的末尾开始第二个div?

如何从第二个对象更改第一个对象的值?

如何在Laravel中从第二个模型到第一个模型获取搜索数据?

如何在一个表中查找与第二个表共享共同祖先的行

如何在gradle中从另一个源集发布第二个库?

如何在Java中获取第二个单词的第一个字符

如何在第一个动画之后播放第二个动画?

如何基于pickerview中的第一个组件选择更改第二个pickerview组件?

在外壳中运行特定命令时如何触发第二个命令?

如何在bash中获取上一个命令的倒数第二个参数?

目标 C - 如何在触摸第一个 SKnode 时禁用第二个 Sknode 的触摸

如何在不添加到第一个表的情况下将表行添加到第二个表中

第二个动画:悬停鼠标时重置第一个动画

如何在同一个类的第二个函数中引用变量?

合并两个 obervables 但在第一个完成之前不触发第二个

我们如何在颤动中单击第一个按钮时重置第二个按钮?

SwiftUI:如何在关闭第一个工作表时显示第二个工作表

如何在与python中的第二个数组相对应的数组中找到一个元素?

如何在javascript的replace方法的第二个参数中引用第一个参数?

如果我更改第一个下拉值,如何重置第二个下拉列表?

如何在同一个按钮单击时触发第二个 javascript 函数

如何在同一个类中调用第二个窗口?