【问题标题】:Reset sliders in RShiny在 RShiny 中重置滑块
【发布时间】:2019-01-04 07:25:53
【问题描述】:

我是闪亮的新手,正在制作一个用户调整 3 个滑块的应用程序。输出是%形式的3个滑块的总变化,以及与初始形式的差异。

我添加了一个“重置”按钮,以便我可以将滑块全部更改回 0,但它不起作用。

我尝试查看R shiny: reset plot to default stateReset inputs with reactive app in shiny,但无济于事。我试了一段代码:

  observeEvent(input$reset,{
    input$Var1=0 
    return(input$Var1)
  })

调整单个滑块并将其设置为0,然后返回该值,同样无济于事。 有什么建议吗?

我的完整代码是:

library(shiny)

ui=fluidPage(
  titlePanel("Sum of Sliders"),
  fluidRow(
    column(2,
           sliderInput("Var1", "Slider1:",
                       min = -100, max = 100,
                       value = 0),
           sliderInput("Var2", "Slider2:",
                       min = -100, max = 100,
                       value = 0),
           sliderInput("Var3", "Slider3:",
                       min = -100, max = 100,
                       value = 0),
           submitButton("Submit"),
           actionButton("reset", "Reset")
    ),
    column(6,
           verbatimTextOutput("text"),
           verbatimTextOutput("text2"),
           verbatimTextOutput("change")
    )
  )
)

server=function(input, output) {
  observeEvent(input$reset,{
    input$Var1=0 
    return(input$Var1)
  })

  output$text <- renderText({
    paste("Starting Value:", 0)
  })

  output$text2= renderText({
    v=rep(0,3)
    v[1]= input$Var1/100
    v[2]= input$Var2/100
    v[3]= input$Var3/100
    paste("Slider Sum:", sum(v))
  })

  output$change <- renderText({
    paste("Difference is:", output$text2-output$text)
  })
}

shinyApp(ui, server)

【问题讨论】:

标签: r shiny reset


【解决方案1】:

要更改现有输入,您可以使用updateSliderInput。此外,由于您包含submitButton,我假设您希望更改仅在您单击该按钮时应用。使用reactiveVal 来获得所需的行为可能是最简单的。下面给出了一个工作示例,创建output$change 留给读者作为练习;)希望这会有所帮助!

library(shiny)

ui=fluidPage(
  titlePanel("Sum of Sliders"),
  fluidRow(
    column(2,
           sliderInput("Var1", "Slider1:",
                       min = -100, max = 100,
                       value = 0),
           sliderInput("Var2", "Slider2:",
                       min = -100, max = 100,
                       value = 0),
           sliderInput("Var3", "Slider3:",
                       min = -100, max = 100,
                       value = 0),
           actionButton('submit','Submit'),
           actionButton("reset", "Reset")
    ),
    column(6,
           verbatimTextOutput("text"),
           verbatimTextOutput("text2")
    )
  )
)

server=function(input, output, session) {
  observeEvent(input$reset,{
    updateSliderInput(session,'Var1',value = 0)
    updateSliderInput(session,'Var2',value = 0)
    updateSliderInput(session,'Var3',value = 0)
  })

  rv_text1 <- reactiveVal()
  rv_text2 <- reactiveVal()

  observeEvent(input$submit,{
    rv_text1(paste("Starting Value:", 0))
    v=rep(0,3)
    v[1]= input$Var1/100
    v[2]= input$Var2/100
    v[3]= input$Var3/100
    rv_text2(paste("Slider Sum:", sum(v)))

  })

  output$text <- renderText({rv_text1()})
  output$text2 <- renderText({rv_text2()})

}

shinyApp(ui, server)

【讨论】:

  • 爱它!还刚刚找到了一种使用stackoverflow.com/questions/40997817/… 计算差异的方法。谢谢!!
  • 太好了,很高兴我能帮上忙!此外,这只是一个快速的答案,但可能稍微干净一点的是将reactiveVal 设置为仅数值,并在rendertext 语句中创建实际文本。所以rv_text2(sum(v))output$text2 &lt;- renderText({paste("Slider Sum:",rv_text2())})。帽子让坐起来更容易在后续计算中使用该数字
  • 另外,如果解决了您的问题,请考虑accepting the answer,谢谢。
  • 感谢您的提示。我还有很长的路要走!顺便说一句,我的实际程序中有 16 个带有滑块的变量,并且实施您的建议效果不佳。我会继续调试看看,但我喜欢它!
  • 嗨@alex,您还可以使用for循环来重置输入。您甚至可以动态获取它们的值。不确定最后一部分是否对您有帮助,但有 16 个滑块,听起来可能是;)参见例如here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多