2017-01-14 2 views
0

Ich möchte ein interaktives Grundstück mit shiny und ggplot2 erstellen. Ich bin in der Lage, dies erfolgreich mit geom_point und anderen geoms mit einer offensichtlichen x und y Achse zu tun. Wenn Sie etwas wie eine geom_bar verwenden, ist dies jedoch schwieriger, da Sie keine y Variable haben.R Shiny Plot Klicken Sie mit Geom Bar und Facetten

Es gibt eine Lösung here und here die x Variable aus dem Klick-Ereignisse zu extrahieren, die Filterung gewünschten zu tun, aber keiner von diesen Parzellen mit Facetten behandeln. Ich möchte die Click-Option auf einem ggplot mit Facetten verwenden. Ich habe versucht, den Code an der ersten Verbindung anzupassen, aber das war nicht erfolgreich.

library(ggplot2) 
library(shiny) 

ui <- fluidPage(
    fluidRow(
    plotOutput("plot1", height = 300, width = 300, 
       click = "plot1_click", 
    ) 
), 
    verbatimTextOutput("x_value"), 
    verbatimTextOutput("selected_rows") 
) 

server <- function(input, output) { 
    output$plot1 <- renderPlot({ 
    ggplot(ToothGrowth, aes(supp)) + geom_bar(stat = "count") + facet_wrap(~dose) 
    }) 

    # Print the name of the x value 
    output$x_value <- renderPrint({ 
    if (is.null(input$plot1_click$x)) return() 

    lvls <- levels(ToothGrowth$supp) 
    lvls[round(input$plot1_click$x)] 
    }) 

    # Print the rows of the data frame which match the x value 
    output$selected_rows <- renderPrint({ 
    if (is.null(input$plot1_click$x)) return() 

    keeprows <- round(input$plot1_click$x) == as.numeric(ToothGrowth$supp) 
    ToothGrowth[keeprows, ] 
    }) 
} 

shinyApp(ui, server) 

Ein Klick auf eine der Bars tut gut auf die x Werte zu filtern, sondern umfasst die Ergebnisse aus allen Facetten. Ich möchte nur Ergebnisse von der angeklickten Facette einbeziehen.

enter image description here

Ich habe versucht, nearPoints mit pannelvar1 verwenden, aber es wirft einen Fehler, da ich es nicht über eine y Variable zu übergeben.

Irgendwelche Gedanken?

Antwort

2

Ich habe Ihre letzte Funktion geändert und habe das gewünschte Ergebnis erhalten.

output$selected_rows <- renderPrint({ 
    if (is.null(input$plot1_click$x)) return() 
    panel = input$plot1_click$panelvar1 

    keeprows <- round(input$plot1_click$x) == as.numeric(ToothGrowth$supp) & ToothGrowth$dose==panel 
    ToothGrowth[keeprows, ] 
    }) 

enter image description here

Ich bin nicht sicher, welche Fehler Sie wurden von dem Versuch, immer panelvar1 zugreifen, aber ich verwendet, um die Konfigurationsoption options(shiny.trace=TRUE), um zu prüfen, wie das Panel Variable zuzugreifen (Meldung unten log hinzugefügt). Vielleicht haben Sie gerade versucht, den Wert von der falschen Position zu ziehen

RECV {"method":"update","data":{"plot1_click":{"x":1.1651034873830555,"y":4.268063179119527,"panelvar1":2,"mapping":{"x":"supp","y":null,"panelvar1":"dose"},"domain":{"left":0.4,"right":2.6,"bottom":-0.5,"top":10.5},"range":{"left":213.995433789954,"right":294.520547945205,"bottom":268.013698630137,"top":23.4383561643836},"log":{"x":null,"y":null},".nonce":0.39996409229934216}}} 
+0

Ich wünschte, ich könnte zweimal upvote. Riesige Hilfe zu den 'Optionen (shiny.trace = TRUE)'. Danke, @danielson. –