2015-11-03 84 views
0

我想使用動態接口使用selectInput小工具更改ggvis陰謀的圖層。問題是,當我在創建繪圖後選擇不同的圖層時,它會發生變化,但它會很快消失。以下是代碼的簡化版本,以顯示省略所有額外動態內容的問題。我只是從數據集中繪製一些數值。我添加了幾個selectInput小部件,讓用戶選擇什麼類型的情節以及何時顯示情節。請注意,我需要包含renderUI中的所有元素。dingically更改ggvis陰謀層

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的情節。

我不知道這是一個錯誤還是我做錯了。任何幫助或建議真的很感激。

回答

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) 
    } 
    } # 
)) 
+0

謝謝,它正在工作。現在唯一的問題是,當我隱藏並嘗試再次顯示劇情時,它不會出現。 – Geovany

+0

嗯,我明白了。我編輯了代碼來解決這個問題。 –

+0

太棒了,現在一切正常。謝謝你的幫助。 – Geovany