动态更改ggvis图层

时间:2015-11-03 00:08:08

标签: r plot shiny ggvis

我想使用动态界面使用ggvis小部件更改selectInput图的图层。问题是,当我在创建绘图后选择不同的图层时,它会发生变化,但它会很快消失。下面是代码的简化版本,用于显示省略所有额外动态内容的问题。我只是从数据集中绘制了一些数值。我添加了几个selectInput小部件,让用户选择什么类型的绘图以及何时显示绘图。请注意,我需要拥有renderUI内的所有元素。

 
library(shiny)
library(ggvis)

runApp(list(
  ui = shinyUI(
        fluidPage(
        sidebarLayout(
          sidebarPanel( uiOutput("controls") ),
          mainPanel( uiOutput("Plot_UI" )
          )
        )
      )
  ),


server = function(input, output, session) {

dat <- reactive(iris[sample(nrow(iris),input$numbers),])

buildPlot <- function(layer = 'points'){
  if (layer=='points'){
    dat %>% 
      ggvis(~Sepal.Width, ~Sepal.Length) %>%
      layer_points() %>%
      bind_shiny("ggvis1")
  } else {
    dat %>% 
      ggvis(~Sepal.Width, ~Sepal.Length) %>%
      layer_bars() %>%
      bind_shiny("ggvis1")
  }
}

output$controls <- renderUI({
  div(
    sliderInput("numbers", label = "Number of values to plot?", min = 1, max = 150, value = 75),
    selectInput('plot_type', 'Plot Type', c("points","bars")),
    selectInput("show", 'Show plot?', c('No','Yes'))
   )
})

output$Plot_UI <- renderUI({
  if (!is.null(input$show) && input$show == 'Yes'){
    cat("Plot_UI -> Build plot\n")
    buildPlot(input$plot_type)
    div(
      uiOutput("ggvis_ui"),
      ggvisOutput("ggvis1")
    )
  }
})
  }
))

再次查看绘图的唯一方法是选择不显示绘图,然后选择使用“显示绘图”selectInput再次显示绘图。

我不知道这是一个错误还是我做错了。

1 个答案:

答案 0 :(得分:2)

我认为问题在于您尝试同时渲染和更新div。

library(shiny)
library(ggvis)

runApp(list(
  ui = shinyUI(
    fluidPage(
      sidebarLayout(
        sidebarPanel( uiOutput("controls") ),
        mainPanel( uiOutput("Plot_UI" )
        )
      )
    )
  ),


  server = function(input, output, session) {

    dat <- reactive(iris[sample(nrow(iris),input$numbers),])

    buildPlot <- function(layer = 'points'){
      if (layer=='points'){
        dat %>% 
          ggvis(~Sepal.Width, ~Sepal.Length) %>%
          layer_points() %>%
          bind_shiny("ggvis1")
      } else {
        dat %>% 
          ggvis(~Sepal.Width, ~Sepal.Length) %>%
          layer_bars() %>%
          bind_shiny("ggvis1")
      }
    }

    output$controls <- renderUI({
      div(
        sliderInput("numbers", label = "Number of values to plot?", min = 1, max = 150, value = 75),
        selectInput('plot_type', 'Plot Type', c("points","bars")),
        selectInput("show", 'Show plot?', c('No','Yes'))
      )
    })

    observeEvent(input$show,{
      if (!is.null(input$show) && input$show == 'Yes'){
        output$Plot_UI <- renderUI({
          cat("Plot_UI -> Build plot\n")
          div(
            uiOutput("ggvis_ui"),
            ggvisOutput("ggvis1")
          )
        })
      }
      if (!is.null(input$show) && input$show == 'No'){
        output$Plot_UI <- renderUI({ div() })
      }
    })

    observe({
      if (!is.null(input$show) && input$show == 'Yes'){
        invalidateLater(100,session)
        renderPlot()
      }
    })

    renderPlot <- function(){
      if(is.null(input$plot_type)) return(NULL)
      buildPlot(input$plot_type)
    }
  } #
))