2017-04-13 4 views
0

Dies ist eine Folge meiner Frage here.R glänzend: Zurücksetzen des Plots auf den Standardzustand

Ich habe ein Diagramm, das angezeigt wird, wenn ich die glänzende App starte, dann möchte ich Code ausführen, der einige Samples aus den Daten "animiert".

Ich würde gerne eine Reset/Clear-Taste implementieren, um das Plot in seinen ursprünglichen Zustand zurückzusetzen (d. H. Als hätte ich die App gerade neu gestartet). Irgendwelche Ideen?

Arbeitsbeispiel meiner aktuellen Code:

library(shiny) 
library(ggplot2) 

invalidateLaterNew <- function (millis, session = getDefaultReactiveDomain(), update = TRUE) 
{ 
    if(update){ 
     ctx <- shiny:::.getReactiveEnvironment()$currentContext() 
     shiny:::timerCallbacks$schedule(millis, function() { 
      if (!is.null(session) && session$isClosed()) { 
       return(invisible()) 
      } 
      ctx$invalidate() 
     }) 
     invisible() 
    } 
} 

unlockBinding("invalidateLater", as.environment("package:shiny")) 
assign("invalidateLater", invalidateLaterNew, "package:shiny") 

data <- data.frame(ID=1:60, 
        x=sort(runif(n = 60)), 
        y=sort(runif(n = 60)+rnorm(60))) 

ui <- fluidPage(
    sidebarPanel(
     sliderInput("n", 
        "Number of samples:", 
        min = 10, 
        max = nrow(data), 
        value = 20), 

     sliderInput("surveys", 
        "Number of surveys:", 
        min = 1, 
        max = 10, 
        value = 5), 

     actionButton("button", "Go!"), 
     actionButton("reset", "Reset") 
    ), 
    # Show the plot 
    mainPanel(
     plotOutput("plot1") 
    ) 
) 

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

    plot1 <- NULL 
    count <- 0 

    output$plot1 <- renderPlot({ 
     plot1 <<- ggplot(data, aes(x=x, y=y)) + geom_point(colour="red") + theme_bw() 
     plot1 <<- plot1 + geom_vline(xintercept = mean(data$x), size=1.1, colour="red") 
     plot1 
    }) 

    observeEvent(input$button,{ 

     count <<- 0 
     output$plot1 <- renderPlot({ 

      count <<- count+1 
      invalidateLater(500, session, count < input$surveys) 
      data$sampled <- "red" 
      sample.rows <- sample(data$ID, input$n) 
      data$sampled[sample.rows] <- "green" 

      plot1 <<- plot1 + geom_point(x=data$x, y=data$y, colour=data$sampled, size=2) 

      sample.mean.x <- mean(data$x[sample.rows]) 

      plot1 <<- plot1 + geom_vline(xintercept = sample.mean.x, colour="green") 

      plot1 

     }) 
    }) 
} 

# Run the application 
shinyApp(ui = ui, server = server) 

habe ich versucht, mit einem Reset-Taste Eingang des ersten renderPlot({...}) Anruf in einem observeEvent Anruf Einwickeln, aber nicht gut. Ich habe auch versucht, einen dritten renderPlot({...}) Aufruf zu erstellen, der eine observeEvent hat. Ich habe sogar versucht, das "Original" plot1 auf eine zweite Variable zu kopieren und das auf den Reset-Knopf zurückzurufen, aber kein Glück.

+0

Sie könnten 'shinyjs :: reset()' versuchen, wie in dieser Dokumentation beschrieben: https://rdrr.io/cran/shinyjs/man/reset.html. Verwenden Sie 'reset (id)', wobei 'id' ein Eingabeelement oder die ID eines div sein kann, um alle Eingabeelemente in diesem div zurückzusetzen. – neilfws

Antwort

0

Laut meinem Kommentar in Ihrer vorherigen Frage habe ich die Änderungen vorgenommen, indem Sie plot1<<-NULL innerhalb der observeEvent hinzufügen und dann wieder das ursprüngliche Diagramm rendern.

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

    plot1 <- NULL 
    count <- 0 

    output$plot1 <- renderPlot({ 
     plot1 <<- ggplot(data, aes(x=x, y=y)) + geom_point(colour="red") + theme_bw() 
     plot1 <<- plot1 + geom_vline(xintercept = mean(data$x), size=1.1, colour="red") 
     plot1 
    }) 

    observeEvent(input$button,{ 
     plot1 <<- NULL 

     output$plot1 <- renderPlot({ 
     plot1 <<- ggplot(data, aes(x=x, y=y)) + geom_point(colour="red") + theme_bw() 
     plot1 <<- plot1 + geom_vline(xintercept = mean(data$x), size=1.1, colour="red") 
     plot1 
     }) 

     count <<- 0 
     output$plot1 <- renderPlot({ 

     count <<- count+1 
     invalidateLater(500, session, count < input$surveys) 
     data$sampled <- "red" 
     sample.rows <- sample(data$ID, input$n) 
     data$sampled[sample.rows] <- "green" 

     plot1 <<- plot1 + geom_point(x=data$x, y=data$y, colour=data$sampled, size=2) 

     sample.mean.x <- mean(data$x[sample.rows]) 

     plot1 <<- plot1 + geom_vline(xintercept = sample.mean.x, colour="green") 

     plot1 

     }) 
    }) 
    } 

Im obigen Fall brauchen Sie den Reset-Knopf nicht. Falls Sie eine Reset-Taste haben möchten, können Sie die plot<<-NULL und renderPlot innerhalb der observeEvent der Reset-Taste setzen. Etwas wie dieses:

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

    plot1 <- NULL 
    count <- 0 

    output$plot1 <- renderPlot({ 
     plot1 <<- ggplot(data, aes(x=x, y=y)) + geom_point(colour="red") + theme_bw() 
     plot1 <<- plot1 + geom_vline(xintercept = mean(data$x), size=1.1, colour="red") 
     plot1 
    }) 

    observeEvent(input$button,{ 

     count <<- 0 
     output$plot1 <- renderPlot({ 

     count <<- count+1 
     invalidateLater(500, session, count < input$surveys) 
     data$sampled <- "red" 
     sample.rows <- sample(data$ID, input$n) 
     data$sampled[sample.rows] <- "green" 

     plot1 <<- plot1 + geom_point(x=data$x, y=data$y, colour=data$sampled, size=2) 

     sample.mean.x <- mean(data$x[sample.rows]) 

     plot1 <<- plot1 + geom_vline(xintercept = sample.mean.x, colour="green") 

     plot1 

     }) 
    }) 


    observeEvent(input$reset,{ 

     plot1<<- NULL 


     output$plot1 <- renderPlot({ 
     plot1 <<- ggplot(data, aes(x=x, y=y)) + geom_point(colour="red") + theme_bw() 
     plot1 <<- plot1 + geom_vline(xintercept = mean(data$x), size=1.1, colour="red") 
     plot1 
     }) 


    }) 

    } 

Hoffe, dass dies hilft!

+0

Genau was ich wollte! Danke noch einmal. – therog1