【问题标题】:Constrain two sliderInput in shiny to sum to 100将两个sliderInput 约束为闪亮的总和为100
【发布时间】:2016-07-14 21:36:28
【问题描述】:

我想创建一个闪亮的应用程序,其中包含两个加起来为 100 的幻灯片输入。这意味着,如果用户更改一个滑块的值,另一个滑块会自动更改以满足约束 (100-input$slider1)。

我在这里发现了一个类似的问题: 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)
  })
})

用户界面:

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 不适合约束。 我怎样才能使一个可以同时更改两个滑块以使另一个适合约束?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我为第二个添加了双 updateSliderInputrenderUI

    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))
    

    【讨论】:

    • 谢谢!是否也可以将最大值保持在 100(查看从 1 到 100 的完整范围)?
    • 现在的问题是,如果你缩小一个滑块,以后就不能再变大了
    • 你可以直接设置另一个滑块的值,而不是设置最大值。例如,updateSliderInput(session, "slider2", value = 100 - input$slider1) 请注意,您需要将它们的总和设为 100,否则它们将不断来回切换。 (我只是建议进行编辑)
    • 最后我没有看@MarkPeterson 的编辑,而是改用renderUI
    • 是的,我有。谢谢你们俩
    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 2018-12-02
    • 2020-04-06
    • 1970-01-01
    • 2020-08-16
    • 2020-02-04
    • 2020-08-11
    • 2023-03-21
    相关资源
    最近更新 更多