2017-04-06 38 views
6

próbuję wyświetlić tabelę danych z „n” liczby kolumn, jak pokazano poniżejTworzenie drążyć raport w R Shiny

Begin Date | EndDate | Month | Year | Count of Students 
2/1/2014 | 1/31/2015 | Jan | 2014 | 10 
3/1/2014 | 2/28/2015 | Feb | 2014 | 20 
4/1/2014 | 3/31/2015 | Mar | 2014 | 30 
5/1/2014 | 4/30/2015 | Apr | 2014 | 40 

Chcę, aby ta tabela danych interaktywne poprzez umożliwienie/wiertła wiertło dół poprzez funkcjonalność, w której użytkownik może kliknąć każdą z wartości w polu "Liczba studentów", aby zobaczyć podstawowe dane za tymi liczbami 10,20,30 i 40. . Na przykład, jeśli użytkownik kliknie "10 "on/ona powinien być w stanie zobaczyć surowe dane ucznia za tą liczbą. Jest to coś podobnego do koncepcji tabel przestawnych w programie Excel, w której użytkownicy widzą podstawowe dane za tabelami przestawnymi. Czy jest sposób, w jaki mogę zrobić to samo, używając R Shiny?

+0

dwie rzeczy: jak powinien drążyć istnieć w interfejsie użytkownika; jak dostałeś dane do stołu? Będziesz musiał stworzyć zarówno doświadczenie ui w lśniących uchwytach do dołu, jak i sposób obsługi danych, który łączy kliknięcie na "10" z ramką danych, która może być podzbiorowana przez "10" z tej kolumny. –

Odpowiedz

7

Tak, używając pakietu DT, aby przechwycić wybrane wiersze i podzestaw główny zestaw. Oto przykład przy użyciu iris zestaw:

library("dplyr") 
library("shiny") 
library("DT") 

# create a summary table 
summary_iris <- group_by(iris, Species) %>% 
    summarise(Count = n()) 

ui <- fluidPage(
    dataTableOutput("summary") 
    , dataTableOutput("drilldown") 
) 


server <- function(input, output){ 

    # display the data that is available to be drilled down 
    output$summary <- DT::renderDataTable(summary_iris) 

    # subset the records to the row that was clicked 
    drilldata <- reactive({ 
    shiny::validate(
     need(length(input$summary_rows_selected) > 0, "Select rows to drill down!") 
    )  

    # subset the summary table and extract the column to subset on 
    # if you have more than one column, consider a merge instead 
    # NOTE: the selected row indices will be character type so they 
    # must be converted to numeric or integer before subsetting 
    selected_species <- summary_iris[as.integer(input$summary_rows_selected), ]$Species 
    iris[iris$Species %in% selected_species, ] 
    }) 

    # display the subsetted data 
    output$drilldown <- DT::renderDataTable(drilldata()) 
} 

shinyApp(ui, server) 

enter image description here

+0

W jaki sposób R wie, co to jest Input $ summary_rows_selected? Ponieważ wszystko z inputid_sums_selected nie jest zdefiniowane w kodzie, ale wywoływane bezpośrednio. – Digvijay

+0

Nieważne, mam to! Jeśli ktoś jeszcze miał to samo pytanie, ** input $ tableId_rows_selected ** jest predefiniowaną funkcją w DT. https://rstudio.github.io/DT/shiny.html – Digvijay