2015-02-10 7 views
4

Благодаря этому solution Я наконец понял, как создать динамическую кнопку SliderInput. К сожалению, у меня есть проблема с этим значением input (для изменения условия подмножества в dplyr). Может ли кто-нибудь сказать мне, что я делаю неправильно?Разработка Реактивное изменение минимальных/максимальных значений sliderInput

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

ответ

2

Поскольку вы используете 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") 

}) 
+0

Спасибо большое! Теперь я понимаю, как Shiny реагирует в подобной ситуации! – Nicolabo

+0

Еще один вопрос! Я заметил, что после того, как я изменил «dataframe» и диапазон в «sliderInput» также изменил все точки точки dissappear. Затем, когда я уменьшаю диапазон, появляются все точки точки. Его можно улучшить? – Nicolabo

+0

'@ NicE' Спасибо еще раз! У меня есть еще один вопрос, связанный с предыдущим. Я описываю это здесь http://stackoverflow.com/questions/28461220/reactive-change-min-max-range-2-dataframes-shiny Я ценю это. :) – Nicolabo