R блестящий: группировка событий actionButton
В моем приложении пользователи вводят 3 элемента (год, дата, станция), нажимают actionButton
и получить температурный график. Без кнопки приложение работало медленно, и при каждом изменении ввода создавался новый сюжет. Поэтому я добавил кнопку, но я не уверен, что сделал это правильно. Я сделал отдельный eventReactive
для всех входов, но я не могу собрать их вместе? Я попробовал несколько вещей, но не мог понять это.
Мне это нужно, потому что я пытаюсь реализовать гифки "загружаются" и "готово" этого парня (мое приложение слишком медленное, люди должны быть уверены, что что-то происходит):
https://github.com/daattali/advanced-shiny/tree/master/busy-indicator
Но с отдельными реактивными событиями гифки появляются и исчезают с каждым шагом, и они должны оставаться в течение всего actionButton
процесс.
РЕДАКТИРОВАТЬ Благодаря Т. Холм я вставил isolate()
, Но прежде чем я попытаюсь реализовать GIF-файлы, я должен настроить вторую часть, и я борюсь там.
РЕДАКТИРОВАТЬ 2 Я только что узнал, чтобы не запускать все внутри renderPlot
в начале приложения вы можете использовать req(input$button)
вместо
if(input$button == 0){return(NULL)}
input$button
if
Решение визуализировало пустой белый прямоугольник (куда придет график), в то время как с req()
ничего не происходит / появляется, прежде чем нажать. Думаю, это может помочь другим людям.
Мой исправленный код:
ui <- fluidPage(
selectInput("jaartal" , choices = 2014:2100, selected = format(Sys.Date(), "%Y")),
uiOutput("datums")
selectInput("weerstation", choices = list("ALDENEIK", "ALKEN")),
actionButton("button", label = "Bereken"),
plotOutput("plotTemp")
)
server <- function(input, output){
# datum range
output$datums <- renderUI({
dateRangeInput("datums", label = h4("Periode"),
start = paste(input$jaartal, "-01-01", sep = ""),
end = paste(input$jaartal, format(Sys.Date(), "%m"),
format(Sys.Date(), "%d"), sep = "-"),
min = paste(input$jaartal, "-01-01", sep = ""),
max = paste(input$jaartal, "-12-31", sep = ""))
})
# plot temperatuur
output$plotTemp <- renderPlot({
req(input$button)
isolate({
importdata(input$jaartal)
weerstation <- which(weerstations == input$weerstation)
temperatuur(input$datums, weerstation)
})
})
Мое приложение показывает второй график с динамикой популяции выбранного вида. Это работало так с моим старым кодом: 1) никаких графиков при запуске. 2) нажатием кнопки создаются графики темпов и населения. 3) выбрать другой вид и сюжет корректируется сразу без кнопки. 4) когда другой вход (дата, станция) изменяется, пользователь должен нажать кнопку, чтобы настроить оба графика.
В настоящее время требования 1), 2) и 3) выполнены, а 4) нет. Когда я меняю станцию, график не перемещается = хорошо, но когда я меняю год или дату, график популяции корректируется = не хорошо. Есть идеи?
output$plotSoort <- renderPlot({
req(input$button)
isolate({
importdata(input$jaartal)
weerstation <- which(weerstations == input$weerstation)
temperatuur(input$datums, weerstation)})
if(input$populatie == "PER"){
perenbladvlo(input$datums, weerstation) # 1st species model
}
else if(input$populatie == "OOR"){
oorworm(input$datums, weerstation) # 2nd species model
}
else if(input$populatie == "FLU"){
fluweelmijt(input$datums, weerstation) # 3rd species model
}
})
1 ответ
Вы можете изменить функцию отображения графика следующим образом:
output$plotTemp <- renderPlot({
input$button
isolate({
importdata(inputJaar())
temperatuur(inputDatum(), inputStation())
})
})
Код в isolate
будет работать только тогда, когда значение input$button
изменения. Это ключевая часть реактивного программирования.
Чтобы продемонстрировать это, запустите следующий скрипт (отредактировал следующие комментарии ниже):
library(shiny)
ui <- shinyUI(fluidPage(
selectInput("jaartal" , label = h4("Jaar"), choices = 2014:2100, selected = format(Sys.Date(), "%Y")),
actionButton("button", label = "Bereken"),
plotOutput("plotTemp")
))
server <- shinyServer(function(input, output){
# datum range
output$plotTemp <- renderPlot({
if(input$button == 0){return(NULL)}
input$button
isolate({
plot(x = 1:100,y=101:200)
title(main=input$jaartal)
})
})
})
runApp(shinyApp(ui,server))