Используйте ReactivePoll внутри наблюдения (R Shiny) - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь получить reactivePoll внутри observe по той причине, что мне нужно, чтобы он запускался только после того, как некоторые req будут заполнены в моем приложении (в противном случае это может произойти сбой), а затем передайте егопеременная сеанса, для которой я использую reactiveValues.По какой-то причине каждый раз, когда я выполняю изменение в переменной, похоже, что reactivePoll создает собственную копию и начинает выполнять checkFunc больше, чем нужно.Минимальный пример:

library(shiny)

ui <- fluidPage(selectInput("x", "Change options", c(1, 2)))

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

  v <- reactiveValues()
  observe({
    print("obs")
    req(input$x)

    v$a <- reactivePoll(5000, session, 
                        checkFunc = function() {
                          print("test")
                          input$x
                        }, valueFunc = function() {
                          print("value")
                          1
                        })

    print(v$a())
  })
}

shinyApp(ui, server)

Как видно, при изменении значения selectInput печать внутри функции проверки оценивается в n + 1 раз больше, чем раньше.

1 Ответ

0 голосов
/ 21 марта 2019
library(shiny)

ui <- fluidPage(selectInput("x", "Change options", c(1, 2)))

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

  a <- reactivePoll(5000, session,
    checkFunc = function() {
      req(input$x)
      print("test")
      input$x
    },
    valueFunc = function() {
      print("value")
      1
    }
  )

  observe({
    print("obs")
    req(input$x)
    v$a <- a()
    print(v$a)
  })
}

shinyApp(ui, server)

Или

server <- function(input, output, session) {
  v <- reactiveValues(
    a = reactivePoll(5000, session,
      checkFunc = function() {
        req(input$x)
        print("test")
        input$x
      },
      valueFunc = function() {
        print("value")
        1
      }
    )
  )  

  observe({
    print("obs")
    req(input$x)
    print(v$a())
  })
}
...