Динамический интерфейс с графиком googlevis в Shiny

У меня небольшая проблема с попыткой заставить динамический интерфейс работать с googlevis. По сути, я хочу разрешить пользователю вводить интересующий диапазон с помощью ползунка и соответственно изменять график. В следующем примере я использовал наборы данных из пакета googlevis, чтобы проиллюстрировать, что я имею в виду. Если вы запустите приведенный ниже код, вы не получите ошибок, однако графики не будут созданы:

ui.R

library(shiny)

shinyUI(fluidPage(
  titlePanel("Example"),
  sidebarLayout(
    sidebarPanel(
      radioButtons('data_choice', 'choose a dataset', 
                   choices= c('dataset1', 'dataset2')),
      uiOutput('slider')
    ),
    mainPanel(
      htmlOutput('view')

    )
  )
))

server.R

library(shiny)
library(googleVis)
library(ggplot2)

dataset1= dino
dataset2= Fruits[,c(1,6)]

shinyServer(function(input, output) {

  #Output new slider depending on dataset chosen
  output$slider<- renderUI({
    if(input$data_choice== 'dataset1'){
      sliderInput('rangeSlider', 'Choose data range',
                  min= 0, max= max(dataset1$Length),
                  value= c(0, max(dataset1$Length)))

    }else if(input$data_choice== 'dataset2'){
      sliderInput('rangeSlider', 'Choose data range',
                  min= 0, max= max(dataset2$Profit),
                  value= c(0, max(dataset2$Profit)))
    }
  })

  #plot adjust
  adjustPlot<- reactive({
    #Adjust dataframes based on input from slider

    if(input$data_choice== 'dataset1'){
      adjusted_dataset1<- subset(dataset1, 
                                 Length >= input$rangeSlider[1] & Length <= input$rangeSlider[2])

    }else if(input$data_choice== 'dataset2'){
      adjusted_dataset2<- subset(dataset2, 
                                 Profit >= input$rangeSlider[1] & Profit <= input$rangeSlider[2])
    }

  })

  output$view <- renderGvis({
    gvisBarChart(adjustPlot(), options= list(height= 700))
  })

})

Если вы замените вывод графиком ggplot, а не googlevis, код будет работать нормально.

ui.R

mainPanel(
      plotOutput('view')
    )

server.R

  #ggplot that works 
  output$view <- renderPlot({
    if(input$data_choice=='dataset1'){
      p<-ggplot(adjustPlot(), aes(x=Dinosaur, y=Length)) 
      p<-p + geom_bar(stat='identity', fill='navyblue') + coord_flip()

    }else if(input$data_choice=='dataset2') {
      p<-ggplot(adjustPlot(), aes(x=Fruit, y=Profit)) 
      p<-p + geom_bar(stat='identity', fill= 'forestgreen') + coord_flip()

    } 

    print(p)

  }, height=550)

Похоже, что существует проблема с отображением графика Google в приложении при вводе входных данных из renderUI (возможно, потому, что он отображает его как html ..). Любая помощь будет очень признательна. Спасибо!


person RXander    schedule 29.12.2014    source источник


Ответы (1)


Не похоже, что эта проблема была слишком популярной, но из-за того, сколько времени я потратил на ее решение, я решил, что опубликую свой ответ в надежде, что он поможет кому-то в будущем. Были две проблемы с исходным кодом, которые я до сих пор не полностью понимаю, но я полагаю, что они связаны с javascript, сгенерированным графиком gvis.

Во-первых, входные переменные в renderUI() должны быть разными для двух условий (renderSlider1 и renderSlider2):

server.R

#Output new slider depending on interested paramter chosen
  output$slider<- renderUI({
    if(input$data_choice== 'dataset1'){
      sliderInput('rangeSlider1', 'Choose data range',
                  min= 0, max= max(dataset1$Length),
                  value= c(0, max(dataset1$Length)), round=T)

    }else if(input$data_choice== 'dataset2'){
      sliderInput('rangeSlider2', 'Choose data range',
                  min= 0, max= max(dataset2$Profit),
                  value= c(0, max(dataset2$Profit)), round=T)
    }
  })

Во-вторых, кажется, что начальное состояние ввода renderUI равно null, что приводит к фрейму данных размера [0,0], который, кажется, останавливает любой вывод gvis; тем не менее, похоже, что это не влияет на графики, созданные renderPlot(). Предоставление условного аргумента renderGvis(), похоже, обходит проблему:

output$view <- renderGvis({
    if(nrow(adjustPlot())!= 0){
      chart<-gvisBarChart(adjustPlot(), options= list(height= 700))
      return(chart)
    }
})  

Я не знаю, почему это происходит (хотелось бы это услышать), но это решает проблему. Ui.R и остальная часть server.R такие же, как указано выше, только не забудьте изменить все входные переменные. Надеюсь, это кому-то поможет!

person RXander    schedule 03.01.2015