闪亮的两个动作按钮

时间:2015-03-09 17:52:58

标签: r shiny

我正在写一个包含两个actionButtons的闪亮函数。这两个是左右按钮,有助于绘图点击时移动。首次单击时,两个按钮都可以正常工作。当我重新单击它们时会发生此问题。无论我点击哪个按钮,它都会在两个范围之间来回反弹。我想这可能是"对"和"左"单击后按钮不会返回0。什么是解决我问题的另一种方法?谢谢你!

我的代码如下:

shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
  sliderInput("test", label="test", min=0, max=1808, value=c(0,50)),
  actionButton("left", "Left"),
  actionButton("right", "Right")

),
mainPanel(
  plotOutput("bar")
)
)
))


shinyServer(function(input, output, session){
observe({
if(input$right){
  isolate({
    if(input$test[2]+ round((input$test[2]-input$test[1])/2) <= 1808)
    updateSliderInput(session, "test", value=c(input$test[1] + round((input$test[2]-input$test[1])/2), input$test[2] + round((input$test[2]-input$test[1])/2)))
})
}
if (input$left){
  isolate({
    if(input$test[1] - round((input$test[2]-input$test[1])/2) > 0)
    updateSliderInput(session, "test", value=c(input$test[1] - round((input$test[2]-input$test[1])/2), input$test[2] - round((input$test[2]-input$test[1])/2)))
})      
}
})

subdata <- reactive({
  sub.data <- data[input$test[1]:input$test[2]]
})

output$bar <- renderPlot({
  barplot(subdata())
})  

})

2 个答案:

答案 0 :(得分:3)

在闪亮的0.11中,事件处理有了非常好的更新,大大简化了actionButton的使用。现在,您可以使用observeEvent()进行此类任务,以便在事件响应中执行功能(例如,按下actionButton

最小工作示例(需要闪亮版本0.11):

library(shiny)
server <- function(input, output, session) {
    observeEvent(input$left, function() {
        if(input$test[2]+ round((input$test[2]-input$test[1])/2) <= 1808)
        updateSliderInput(session, "test", value=c(input$test[1] + round((input$test[2]-input$test[1])/2), input$test[2] + round((input$test[2]-input$test[1])/2)))
    }

    )
    observeEvent(input$right, function() {
         if(input$test[1] - round((input$test[2]-input$test[1])/2) > 0)
    updateSliderInput(session, "test", value=c(input$test[1] - round((input$test[2]-input$test[1])/2), input$test[2] - round((input$test[2]-input$test[1])/2)))
    }
    )
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
    sliderInput("test", label="test", min=0, max=1808, value=c(0,50)),
      actionButton("left", "Left"),
      actionButton("right", "Right")
    ),
    mainPanel(


    )
  )
)

shinyApp(ui = ui, server = server)

答案 1 :(得分:1)

您可以尝试使用两个observe表达式,每个按钮一个。

observe({
  if(input$right){
    isolate({
        if(input$test[2]+ round((input$test[2]-input$test[1])/2) <= 1808)
          updateSliderInput(session, "test", value=c(input$test[1] + round((input$test[2]-input$test[1])/2), input$test[2] + round((input$test[2]-input$test[1])/2)))
      })
    }
})

observe({
  if(input$left){ 
    isolate({
        if(input$test[1] - round((input$test[2]-input$test[1])/2) > 0)
          updateSliderInput(session, "test", value=c(input$test[1] - round((input$test[2]-input$test[1])/2), input$test[2] - round((input$test[2]-input$test[1])/2)))
      }) 
  }
})

每个按钮只有在单击时才会被触发,您不需要重置按钮的值。