2016-07-14 38 views
1

我想用兩個滑動輸入創建一個閃亮的應用程序,最多可以累加100.這意味着,如果用戶更改了一個滑塊的值,另一個滑塊自動更改以滿足約束(100輸入$ slider1)。約束兩個sliderInput閃亮的總和爲100

我發現了一個類似的問題在這裏: Examplecode

用下面的代碼:

服務器:

library(shiny) 

# Define server logic required 
shinyServer(function(input, output) { 

    output$slider2 <- reactiveUI(function() { 
    sliderInput("slider2", "Slider 2", min = 0, max = 100 - input$slider1, value = 0) 
    }) 

    output$restable <- renderTable({ 
    myvals<- c(input$slider1, input$slider2, 100-input$slider1-input$slider2) 
    data.frame(Names=c("Slider 1", "Slider 2", "Slider 3"), 
       Values=myvals) 
    }) 
}) 

UI:

library(shiny) 

# Define UI for application 
shinyUI(pageWithSidebar(

    # Application title 
    headerPanel("Sliders should sum to 100!"), 

    # Sidebar with sliders whos sum should be constrained to be 100 
    sidebarPanel(
    sliderInput("slider1", "Slider 1: ", min = 0, max = 100, value = 0, step=1), 
    uiOutput("slider2") 
), 

    # Create table output 
    mainPanel(
    tableOutput("restable") 
) 
)) 

這已經是一個好的解決方案。但是,在這裏只能更改滑塊1以獲得滑塊2的自動更改。另一方面,如果用戶更改滑塊2,則滑塊1不適合約束。 我怎樣才能讓它可以改變兩個滑塊,使另一個適合約束?

回答

3

我添加了一個renderUI沿雙updateSliderInput的第二個

rm(list = ls()) 
library(shiny) 

ui <-pageWithSidebar(

    # Application title 
    headerPanel("Sliders should sum to 100!"), 
    # Sidebar with sliders whos sum should be constrained to be 100 
    sidebarPanel(
    sliderInput("slider1", "Slider 1: ", min = 0, max = 100, value = 0, step=1), 
    uiOutput("slider")), 

    # Create table output 
    mainPanel(tableOutput("restable")) 
) 

server <- function(input, output,session) { 

    observe({ 
    updateSliderInput(session, "slider1", min =0,max=100, value = 100 - input$slider2) 
    }) 
    output$slider <- renderUI({ 
    sliderInput("slider2", "Slider 2: ", min=0,max=100, value=100 - input$slider1) 
    }) 

    output$restable <- renderTable({ 
    myvals<- c(input$slider1, input$slider2, 100-input$slider1-input$slider2) 
    data.frame(Names=c("Slider 1", "Slider 2", "Slider 3"),Values=myvals) 
    }) 
} 
runApp(list(ui = ui, server = server)) 

enter image description here

+0

謝謝!是否也可以將最大值保持在100(以查看從1到100的整個範圍)? –

+0

現在的問題是,如果縮小一個滑塊,則不能再將其大一些。 –

+0

除了設置最大值外,還可以直接設置另一個滑塊的值。例如,'updateSliderInput(session,「slider2」,value = 100 - input $ slider1)'請注意,你需要將它們加起來爲100,否則它們會不停地來回切換。 (我只是建議編輯做到這一點) –