Обновление реактивных разрывов значений invalidateLater - PullRequest
0 голосов
/ 27 сентября 2019

В следующем блестящем приложении:

При нажатии кнопки она печатается на консоли один раз в секунду.

library(shiny)
library(rlang)

ui <- fluidPage(
  textOutput("text"),
  actionButton("button","Click to Start")
)

server <- function(input, output, session) {
    myVal <- reactiveVal(0)
    startCount <- reactiveVal(FALSE)
    observeEvent(input$button,{
        startCount(TRUE)
    })

    observe({
        req(startCount())
        req(myVal() < 5)
        invalidateLater(1000)
        newVal <-myVal() + 1
        # myVal(newVal)
        print(myVal())
    })

    output$text <- renderText(myVal())
}

shinyApp(ui, server)

При удалении комментария # myVal(newVal) она печатает от 1 до 5 вконсоль, и отображает 5 в пользовательском интерфейсе.Но есть две проблемы:

  1. invalidateLater перестает работать, он не ждет больше одной секунды.
  2. Пользовательский интерфейс мгновенно переходит на 5 вместо отображения 1,2,3,4,5 с интервалом в одну секунду.

Что я должен сделать, чтобы все заработало как положено?

1 Ответ

1 голос
/ 27 сентября 2019

Вам понадобится isolate, чтобы избежать рекурсивного запуска наблюдателя:

library(shiny)
library(rlang)

ui <- fluidPage(
  textOutput("text"),
  actionButton("button","Click to Start")
)

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

  myVal <- reactiveVal(0)
  startCount <- reactiveVal(FALSE)
  observeEvent(input$button,{
    startCount(TRUE)
  })

  observe({
    req(startCount())
    req(isolate(myVal()) < 5)
    invalidateLater(1000)
    isolate(myVal(myVal() + 1))
    print(myVal())
  })

  output$text <- renderText(myVal())
}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...