Как запустить и остановить функцию invalidateLater - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в R и Shiny, я хотел бы написать приложение, которое будет печататься автоматически, и я могу нажать, чтобы остановить, если я хочу изменить настройку. Я нашел простой пример, и я попытался изменить, когда я нажал кнопку «Выполнить» или «Стоп», но это не сработало. Может кто-нибудь показать мою проблему или некоторые документы, которые я могу научиться делать это. Спасибо.

library(shiny)

library(shinyjs)

 shinyApp(

 ui = fluidPage(

      useShinyjs(), 



 # Set up shinyjs

      "Count:", textOutput("number", inline = TRUE), br(),
      actionButton("start", "Start"), br(),
     "The button will be pressed automatically every 3 seconds",br(),
      actionButton("stop", "Stop"), br(),
     "The counter will stop when the button is pressed"
    ),
    server = function(input, output) {
      output$number <- renderText({
        input$start
      })

      observe({
        #if (click("start") == TRUE) {
          click("start")
          invalidateLater(3000)
       # }
      })
      observe({
        click("stop")
        #shinyjs::disable("start")
      })
    }
  )

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Решение состоит в использовании checkboxInput для кнопки остановки:

library(shiny)
library(shinyjs)

shinyApp(

  ui = fluidPage(

    useShinyjs(), 
    # Set up shinyjs

    "Count:", textOutput("number", inline = TRUE), br(),
    actionButton("start", "Start"), br(),
    "The button will be pressed automatically every 3 seconds",br(),
    checkboxInput("stop", "Stop"), br(),
    "The counter is stopped when the checkbox is pressed"
  ),
  server = function(input, output, session) {
    output$number <- renderText({
      input$start
    })

    # unselect stop when start is pressed
    observeEvent(input$start, {
      if(input$stop){
        updateCheckboxInput(session, "stop", value = FALSE)
      }
    })

    # every 3000 ms, press start (if stop is unselected, else do nothing)
    observe({
      invalidateLater(3000)

      if(!isolate(input$stop)){
        click("start")
        updateCheckboxInput(session, "stop", value = FALSE)
      }
    })

    # after clicking start, uncheck stop checkbox
    observeEvent(input$start, {
      updateCheckboxInput(session, "stop", value = FALSE)
    })
  }
)

enter image description here

0 голосов
/ 25 апреля 2018
shinyApp(
  ui = fluidPage(
    useShinyjs(), 
    "Count:", textOutput("number", inline = TRUE), br(),
    actionButton("start", "Start"), br(),
    "The button will be pressed automatically every 3 seconds",br(),
    actionButton("stop", "Stop"), br(),
    "The counter will stop when the button is pressed"
  ),
  server = function(input, output) {
    observe(cat(str(reactiveValuesToList(input)), "\n"))
    output$number <- renderText({
      input$start
    })
    observe({
      if (!input$stop) {
        click("start")
        invalidateLater(3000)
      }
    })
  }
)

observe(cat(str(reactiveValuesToList(input)), "\n")) - моя "блестящая хитрость для разработчиков", которая помогает мне увидеть, что происходит.input$stop изначально 0.При первом щелчке он увеличивается до 1, и условие становится ложным.

См. Также этот ответ: https://stackoverflow.com/a/47486524/6197649


Изменить за ваш комментарий:

server = function(input, output, session) {

    output$number <- renderText({
      input$start
    })

    stop_2 <- reactiveVal(FALSE)

    observeEvent(input$stop, stop_2(TRUE))

    observeEvent(input$start, if (stop_2()) stop_2(FALSE))

    observe({
      if (isolate(!stop_2() && input$start)) click("start") 
      invalidateLater(3000)
    })

  }

Это обходной путь из-за невозможности сброса кнопки действия.

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