2017-04-12 28 views
-1

我正試圖構建一個閃亮的儀表板,其中包含圖表下的DT Package的HTML5 DataTable。圖表連接到DataTable,以便過濾DataTable將過濾圖表。當使用Shiny&DT DataTable創建ggvis堆棧條形圖時,「邏輯索引向量的長度錯誤」

我能夠成功地將這一功能對於ggvis散點圖,但是當我試圖爲柱狀圖我得到的錯誤Error in: Length of logical index vector must be 1 or 10, got: 0

這裏做同樣是server.R的散點圖其中工程

server <- function(input, output) { 


    server_DF <- data.frame(dataset) 


    output$html_data_table <- DT::renderDataTable({ 
    DT::datatable(unique(server_DF[, input$show_vars, drop = FALSE]), 
        filter = "top", selection = "multiple") 
    }) 



    filtered_rows <- reactive({ 
    input$html_data_table_rows_all 
    }) 



    vis <- reactive({ 
     # filtered_rows <- input$html_data_table_rows_all 

     xvar <- prop("x", as.symbol(input$xvar)) 
     yvar <- prop("y", as.symbol(input$yvar)) 
     colvar <- prop("fill", as.symbol(input$colvar))         


     p <- server_DF[filtered_rows(),] %>% 
     ggvis(x = xvar, y = yvar, fill := colvar) %>% 
     layer_points() %>% 
     set_options(width = "auto", height = "auto", resizable=FALSE) 

     p 


      }) 



    vis %>% bind_shiny("plot", "ggvis_ui") 


} 

這是條形圖的代碼,它給了我錯誤。請注意,唯一不同的是layer_bars()在上面的代碼中是layer_points()

server <- function(input, output) { 


    server_DF <- data.frame(dataset) 


    output$html_data_table <- DT::renderDataTable({ 
    DT::datatable(unique(server_DF[, input$show_vars, drop = FALSE]), 
        filter = "top", selection = "multiple") 
    }) 



    filtered_rows <- reactive({ 
    input$html_data_table_rows_all 
    }) 



    vis <- reactive({ 
     # filtered_rows <- input$html_data_table_rows_all 

     xvar <- prop("x", as.symbol(input$xvar)) 
     yvar <- prop("y", as.symbol(input$yvar)) 
     colvar <- prop("fill", as.symbol(input$colvar))         


     p <- server_DF[filtered_rows(),] %>% 
     ggvis(x = xvar, y = yvar, fill := colvar) %>% 
     layer_bars() %>% 
     set_options(width = "auto", height = "auto", resizable=FALSE) 

     p 


      }) 



    vis %>% bind_shiny("plot", "ggvis_ui") 

} 

發現如果我刪除fill := colvar它會生成直方圖。但是當我像散點圖那樣輸入fill := colvar時,出現錯誤。

以下是ui.R的完整代碼和散點圖的樣本數據。只是想複製下面的堆疊酒吧。

library(shiny) 
library(data.table) 
library(ggvis) 
library(DT) 


data("diamonds") 

dataset <- diamonds 
rm(diamonds) 

axis_vars <- names(dataset) 

ui <- fluidPage(pageWithSidebar(

    headerPanel("Sample Dashboard"), 

    sidebarPanel(

    selectInput('xvar', 'X Axis', axis_vars, selected = axis_vars[2]), 
    selectInput('yvar', 'Y Axis', axis_vars, selected = axis_vars[7]), 
    selectInput("colvar", "Colour", axis_vars, selected = axis_vars[4]) 

), 

    mainPanel(
    fluidRow(
     ggvisOutput("plot") 
    ), 

    fluidRow(
    column(width = 4, 
      checkboxGroupInput('show_vars', 'Select Columns To Display', 
           names(dataset),selected = names(dataset)) 
      ), 
    column(width = 8, 
      div(style = 'overflow-x: scroll', DT::dataTableOutput('html_data_table')) 
      ) 

    ) 

) 
)) 


server <- function(input, output) { 


    server_DF <- data.frame(dataset) 


    output$html_data_table <- DT::renderDataTable({ 
    DT::datatable(unique(server_DF[, input$show_vars, drop = FALSE]), 
        filter = "top", selection = "multiple") 
    }) 



    filtered_rows <- reactive({ 
    input$html_data_table_rows_all 
    }) 



    vis <- reactive({ 
    # filtered_rows <- input$html_data_table_rows_all 

    xvar <- prop("x", as.symbol(input$xvar)) 
    yvar <- prop("y", as.symbol(input$yvar)) 
    colvar <- prop("fill", as.symbol(input$colvar))         


    p <- server_DF[filtered_rows(),] %>% 
     ggvis(x = xvar, y = yvar, fill = colvar) %>% 
     layer_points() 

    p 


    }) 



    vis %>% bind_shiny("plot") 


} 

shinyApp(ui, server) 

一直在掙扎着這幾天。任何幫助將不勝感激。

回答

0

發生這種情況是因爲input$html_data_table_rows_all在開始時是NULL。因此,只有當它不是NULL時,您才需要保持運行該反應式代碼的條件。我修改了你的服務器代碼來做到這一點。

server <- function(input, output) { 

    server_DF <- data.frame(dataset) 

    output$html_data_table <- DT::renderDataTable({ 
    DT::datatable(unique(server_DF[, input$show_vars, drop = FALSE]), 
        filter = "top", selection = "multiple") 
    }) 


    filtered_rows <- reactive({ 
    input$html_data_table_rows_all 
    }) 

    observe({ 

    #Check that the input for the plot is not NULL 
    if(!is.null(input$html_data_table_rows_all)){ 

     vis <- reactive({ 
     # filtered_rows <- input$html_data_table_rows_all 
     xvar <- prop("x", as.symbol(input$xvar)) 
     yvar <- prop("y", as.symbol(input$yvar)) 
     colvar <- prop("fill", as.symbol(input$colvar))         

     p <- server_DF[filtered_rows(),] %>% 
      ggvis(x = xvar, y = yvar, fill = colvar) %>% 
      layer_bars() 
     p 

     }) 

     vis %>% bind_shiny("plot") 
    } 
    }) 
} 

希望它有幫助!