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.
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