2016-11-08 1 views
2

Bitte führen Sie den Beispielcode aus.R Shiny: Seltsames Verhalten der Pinselfunktionalität mit ggplot2

Wenn ich Punkte in den Streudiagrammen auswähle, werden diese ausgewählten Punkte aus den Diagrammen gelöscht. Es funktioniert meistens gut, außer dass, wenn ich einige Punkte in der Nähe der Ecken der Charts auswähle, diese Punkte nach einer schnellen Doppel-Selbstaktualisierung zurückkommen.

Für die Punkte im mittleren Teil der Charts funktioniert es einfach.

enter image description here

Wie dieses seltsame Verhalten erklären?

library(ggplot2) 
library(shiny) 

server <- function(input, output) { 

    vals = reactiveValues(keeprows = TRUE) 

    observeEvent(input$brush_1,{ 
    cat("---------------\n") 
    print("brush_1") 
    Res = brushedPoints(mtcars,brush = input$brush_1,allRows = TRUE) 
    vals$keeprows = !Res$selected_  
    }) 

    observeEvent(input$brush_2,{ 
    cat("---------------\n") 
    print("brush_2") 
    Res = brushedPoints(mtcars,brush = input$brush_2,allRows = TRUE) 
    vals$keeprows = !Res$selected_  
    }) 

    D = reactive({ 
    print("D") 
    mtcars[vals$keeprows,] 
    }) 

    output$p1 = renderPlot({ 
    print("plot_1") 
    X = D() 
    ggplot(X,aes(x=mpg,y=cyl))+geom_point() 
    }) 
    output$p2 = renderPlot({ 
    print("plot_2") 

    ggplot(D(),aes(x=mpg,y=wt))+geom_point() 
    }) 

    output$L = renderPrint({ 
    Res = brushedPoints(mtcars,brush = input$brush_1,allRows = TRUE) 
    Res 
    }) 
} 


ui <- fluidPage(
    splitLayout(plotOutput("p1",brush = "brush_1"),plotOutput("p2",brush = "brush_2")) 
       , 
    verbatimTextOutput("L") 
) 


shinyApp(ui = ui, server = server) 

Es scheint, dass das brush_1 Ereignis zweimal ausgelöst wird und die Handlung wird zurückgesetzt, wenn diese seltsamen Punkte ausgewählt werden.

Antwort

3

Das Problem tritt auf, wenn Sie die Punkte an den Grenzen des Grundstücks zu deaktivieren, weil es dann neu gezeichnet wird den ganzen Raum zu passen, und dies führt zum Löschen der Bürste ...

Sie fix Grenzen auf dem Grundstück festlegen um es zu verhindern:

ggplot(X,aes(x=mpg,y=cyl))+ 
geom_point()+ 
scale_x_continuous(limits=c(min(mtcars$mpg),max(mtcars$mpg)))+ 
scale_y_continuous(limits=c(min(mtcars$cyl),max(mtcars$cyl))) 
+0

Danke. Es ist perfekt. – John