Динамический интерфейс с 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..). Любая помощь будет высоко ценится. Спасибо!

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 является нулевым, что приводит к кадру данных измерения [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 такие же, как и выше, просто обязательно измените все входные переменные. Надеюсь, это поможет кому-то!

Другие вопросы по тегам