2016-08-24 2 views
0

Ich kann eine Datentabelle in glänzend erstellen, die Daten für jeden einzelnen Büffel zeigt, aber ich kann nicht herausfinden, wie alle Buffalo-Daten zur gleichen Zeit angezeigt werden. Jede Hilfe wird geschätzt.Shiny Datentabelle zeigt alle Daten mit Filter

Beispieldaten:

cleanbuffalo <- data.frame(name = c("queen","toni","pepper"), longitude = c(31.8,32,33), latitude = c(-24,-25,-26))

Shiny UI:

shinyUI(navbarPage("Buffalo Migration", id ="nav", 
    tabPanel("Data", 
    fluidRow(
     column(3, 
     selectInput("allnamesbuffalo", "Buffalo", c("All Buffalo" = "all buffalo", vars)) 
     ) 
    ), 
     hr(), 
     DT::dataTableOutput("buffalotable") 
    ) 
) 
) 

Shiny Server:

shinyServer(function(input, output, session) { 
    observe({ 
    allnamesbuffalo <- if (is.null(input$allnamesbuffalo)) character(0) else  { 
      filter(cleanbuffalo, name %in% input$allnamesbuffalo) %>% 
     `$`('name') %>% 
     unique() %>% 
     sort() 
     } 
    }) 

    output$buffalotable <- DT::renderDataTable({ 
    df <- cleanbuffalo %>% 
     filter(
     cleanbuffalo$name == input$allnamesbuffalo, 
     is.null(input$allnamesbuffalo) | name %in% cleanbuffalo$name 
    ) 
     action <- DT::dataTableAjax(session,df) 

     DT::datatable(df, options = list(ajax = list(url = action)), 
        escape = FALSE) 
    }) 
}) 
+0

Die Idee ist, dass, wenn der Benutzer 'all buffalo' auswählt, die Namensvariable eine Liste aller Büffelnamen enthalten sollte, ansonsten enthält sie nur diesen spezifischen Buffalo-Namen. Sie können die Variable 'names' mit if/else vor dem Filter berechnen. –

+0

Würde es Ihnen etwas ausmachen, etwas genauer zu sein? Ich denke, dass ich den Namensvariablenupdate basierend auf Benutzerauswahl mit If/Else haben muss. Wenn ich jedoch versuche, die Namensvariable so zu ändern, dass alle Buffalo-Namen in der Auswahl für alle Büffel enthalten sind, erhalte ich Fehler. Danke für Ihre Hilfe. – josh453

Antwort

1

Hier ist ein funktionierendes Beispiel. Beachten Sie, dass ich in Ihrem Datenrahmen stringsAsFactors=F hinzugefügt habe, andernfalls müssen Sie levels(cleanbuffalo$name) verwenden, um die Namen abzurufen.

library(shiny) 
library(dplyr) 

cleanbuffalo <- data.frame(name = c("queen","toni","pepper"), 
          longitude = c(31.8,32,33), 
          latitude = c(-24,-25,-26), stringsAsFactors = F) 

ui <- shinyUI(fluidPage(

    titlePanel("Example"), 

    sidebarLayout(
    sidebarPanel(
     selectInput("allnamesbuffalo", "Buffalo", c("all", cleanbuffalo$name)) 
    ), 

    mainPanel(
     dataTableOutput("buffalotable") 
    ) 
) 
)) 

server <- shinyServer(function(input, output, session) { 

    output$buffalotable <- renderDataTable({ 
    names <- NULL 
    if (input$allnamesbuffalo == "all") { 
     names <- cleanbuffalo$name 
    } else { 
     names <- input$allnamesbuffalo 
    } 
    filter(cleanbuffalo, name %in% names) 
    }) 

}) 

shinyApp(ui = ui, server = server) 
+0

Dies funktionierte perfekt für mich, danke für Ihre Hilfe. Ich hatte vorher ein grobes Verständnis und konnte die if/else-Aussage nicht richtig finden. – josh453

Verwandte Themen