2016-01-19 2 views
3

Простой пример Блестящего приложения, использующего ggvis. Попытка использовать раскрывающееся меню для фильтрации переменной. Поэтому здесь я пытаюсь отфильтровать механизм mtcars (3, 4 или 5), а затем график x и y mpg и hp для каждого из уникальных значений шестерни.Реактивный вход не работает с ggvis и Shiny

Я получаю начальный график, выбранный по умолчанию «3», но если я изменил значение с помощью раскрывающегося списка, ничего не произойдет. Я думаю, что знаю, где все идет не так (прокомментировано в коде), но я пробовал все, о чем я могу думать, и понятия не имею, что я делаю.

Благодаря

ui.R

# ui.R 

library(shiny) 

shinyUI(fluidPage(
    titlePanel("Car Thing"), 

    sidebarLayout(
    sidebarPanel(

     uiOutput("choose_gear")      
    ), 

    mainPanel(
     ggvisOutput("ggvis")   
    ) 
) 
)) 

server.R

#server.R 

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

gear_nos <- sort(unique(mtcars$gear)) 

    shinyServer(function(input, output, session) { 

     output$choose_gear <- renderUI({   
      selectInput("gears", "Choose Gear", gear_nos, selected="3")         
     })    

     # I'm pretty sure this is where I'm messing something up 
     pickedGear <- reactive({ 
      mtcars %>% filter(gear == input$gears) 
     }) 

     if(is.null(dim(pickedGear))){ 
      pickedGear <- mtcars[mtcars$gear == 3,] 
     } 

     pickedGear %>% ggvis(~mpg, ~hp) %>% layer_points(fill := "green") %>% bind_shiny("ggvis") 

}) 
+0

Разъяснения по ДОЛЖНОСТЬ: это, вероятно, работает отлично. Я просто делаю что-то не так с моим кодом. – noLongerRandom

ответ

1

Я думаю, что это может быть то, что вы хотите.

Обратите внимание, что это заняло у меня довольно долго, чтобы выяснить validate часть, которая устраняет сообщение об ошибке (постороннее incorrect string: length(0) 32 expected) на инициализации запуска в shinyServer кода, но я помню его на будущее теперь я думаю.

library(shiny) 
library(ggvis) 
library(dplyr) 
# library(googleVis) # used observe instead now 

u <- shinyUI(fluidPage(
    titlePanel("Car Thing"), 

    sidebarLayout(
    sidebarPanel(
     uiOutput("choose_gear")      
    ), 
    mainPanel(
     ggvisOutput("ggvis")   
    ) 
) 
)) 
gear_nos <- sort(unique(mtcars$gear)) 

s <- shinyServer(function(input, output, session) { 

    output$choose_gear <- renderUI({ 
     selectInput("gears", "Choose Gear", gear_nos, selected="3") 
    })    

    pickedGear <- reactive({ 
    shiny::validate(need(input$gears, message=FALSE)) 
    mtcars %>% filter(gear == input$gears) 
    }) 

    # could also replace "observe" with this from googlevis : "output$ggvis <- renderGvis({" 
    observe({ 
    pickedGear() %>% ggvis(~mpg,~hp) %>% layer_points(fill:="green") %>% bind_shiny("ggvis") 
    }) 
}) 
shinyApp(u,s) 

Уступая:

enter image description here

+0

Обратите внимание, что можно избавиться от сообщения об ошибке, сделав статическое устройство 'selectInput'. Но это тоже должно работать, но я пока не добился успеха. –

+0

Спасибо. Это работает, и я отметил его как принятый, но мне любопытно, что купе вещей A) Что не работает в моем коде (или почему реактивная функция не передавала значение «selectedGear»)? B) Почему добавление «renderGvis»? Нельзя ли сделать это без дополнительного пакета googleVis? – noLongerRandom

+0

Для 1), 'selectedgear' не был реактивным, поэтому он не будет выполнен, когда вход изменится. Практически весь ваш код (кроме инициализации) должен быть в «реактивном», или «наблюдаемом», или в другом пакете (например, «renderGvis»), или он не будет выполнен. Блестящий использует модель, управляемую событиями. Что касается 2), я только видел работу ggvis с блестящим пакетом 'googleVis'. Но я не могу гарантировать, что это абсолютно необходимо, так как я не использую 'ggvis' много. –

Смежные вопросы