【问题标题】:Develop Reactive change of min / max values of sliderInput开发sliderInput的最小值/最大值的反应性变化
【发布时间】:2015-04-10 06:03:00
【问题描述】:

感谢solution 我终于知道如何创建动态 SliderInput 按钮。不幸的是,我毕竟在使用这个input 值时遇到了问题(更改dplyr 中的子集条件)。谁能告诉我我做错了什么?

ui.R

library(dplyr)
library(shiny)
library(ggvis)

shinyUI(fluidPage(

titlePanel("Old Faithful Geyser Data"),

# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
  radioButtons("dataset", label = h4("Product level"),
               choices = list("Item" = "df1", "Task" = "df2")),
  uiOutput("slider")
  ),
mainPanel(
  ggvisOutput("plot")
   )
 )
))

server.R

 library(shiny)
 library(dplyr)

 df1 <- data.frame(id = c(1,2,3,4,5), number = c(20,30,23,25,34))
 df2 <- data.frame(id = c(1,2), number = c(33,40))

 shinyServer(function(input, output) {

 datasetInput <- reactive({
   switch(input$dataset,
         df1 = df1,
         df2 = df2)
 })

 output$slider <- renderUI({
   sliderInput("inslider","Slider", min   = min(datasetInput()$number), 
                                   max   = max(datasetInput()$number),
                                   value = c(min(datasetInput()$number),     
                                             max(datasetInput()$number))
 })
 data <- reactive({
  datasetInput %>%
    filter(number >= input$inslider[1],
           number <= input$inslider[2])
 })

 vis <- reactive({
  data %>%
   ggvis(~id, ~number) %>%
   layer_points(fill = ~factor(id)) %>%
   scale_nominal("fill", range = c("red","blue","green","yellow","black"))

 })
 vis %>% bind_shiny("plot") 
})

【问题讨论】:

    标签: r render shiny dplyr


    【解决方案1】:

    由于您使用renderUI 制作滑块,因此您必须在过滤数据之前检查input$inslider 是否存在。当你第一次加载它时,它不会因为它是由renderUI创建的

    试试这个server.R

    library(shiny)
    library(dplyr)
    
    df1 <- data.frame(id = c(1,2,3,4,5), number = c(20,30,23,25,34))
    df2 <- data.frame(id = c(1,2), number = c(33,40))
    
    shinyServer(function(input, output) {
    
      datasetInput <- reactive({
        switch(input$dataset,
               "df1" = df1,
               "df2" = df2)
      })
    
      output$slider <- renderUI({
        sliderInput("inslider","Slider", min   = min(datasetInput()$number), 
                    max   = max(datasetInput()$number),
                    value = c(min(datasetInput()$number),     
                              max(datasetInput()$number))
      )})
    
    
      data <- reactive({
        filteredData<-datasetInput()
        if(!is.null(input$inslider)){
          filteredData<-filteredData %>%
          filter(number >= input$inslider[1] ,
                 number <= input$inslider[2] )
        }
        filteredData
        })
    
      vis <- reactive({
    
        data()%>%
          ggvis(~id, ~number) %>%
          layer_points(fill = ~factor(id)) %>%
          scale_nominal("fill", range = c("red","blue","green","yellow","black"))
    
      })
      vis %>% bind_shiny("plot") 
    
    })
    

    【讨论】:

    • 非常感谢!现在我明白了 Shiny 在类似情况下的反应!
    • 还有一个问题!我注意到,在我更改dataframesliderInput 的范围后,所有点也会消失。然后,当我减小 range 时,所有的点都会出现。可以改进吗?
    • @NicE 再次感谢!我还有一个与前一个问题相关的问题。我在这里描述它stackoverflow.com/questions/28461220/…我很感激。:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 2013-11-03
    • 2017-01-28
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多