闪亮的两个动作按钮
Two actionButtons in Shiny
我正在编写一个闪亮的函数,其中包含两个操作按钮。这两个是左右按钮,单击它们可以帮助绘图移动。首次单击时,这两个按钮均正常工作。当我重新单击它们时出现问题。无论我点击哪个按钮,它都会在两个范围之间来回跳动。我猜可能是 "right" 和 "left" 按钮在点击后没有 return 到 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())
})
})
您可以尝试使用两个 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)))
})
}
})
每个按钮只有在被点击时才会被触发,您不需要重新设置按钮的值。
在闪亮的 0.11 中,事件处理有了非常好的更新,大大简化了 actionButton 的使用。现在您可以将 observeEvent()
用于此类任务,您希望在其中执行功能以响应事件(例如按下 actionButton
)
最小工作示例(需要 shiny 版本 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)
我正在编写一个闪亮的函数,其中包含两个操作按钮。这两个是左右按钮,单击它们可以帮助绘图移动。首次单击时,这两个按钮均正常工作。当我重新单击它们时出现问题。无论我点击哪个按钮,它都会在两个范围之间来回跳动。我猜可能是 "right" 和 "left" 按钮在点击后没有 return 到 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())
})
})
您可以尝试使用两个 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)))
})
}
})
每个按钮只有在被点击时才会被触发,您不需要重新设置按钮的值。
在闪亮的 0.11 中,事件处理有了非常好的更新,大大简化了 actionButton 的使用。现在您可以将 observeEvent()
用于此类任务,您希望在其中执行功能以响应事件(例如按下 actionButton
)
最小工作示例(需要 shiny 版本 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)