Функция блестящего значения R не запускается в реактиве - PullRequest
0 голосов
/ 20 декабря 2018

Я использую реактивПолл для обновления своей блестящей панели.При первом запуске приложения оно работает нормально.Я дал временной интервал в 1 минуту для обновления данных.Через 1 минуту данные обновляются, как и ожидалось.Со следующей минуты функция проверки запускается каждую 1 минуту, но функция значения не запускается, и я не получаю последние данные.

app.R

 library(shiny)
 library(shinythemes)
 library(shinyWidgets)
 library(shinydashboard)
 library(shinycssloaders)
 library(RPostgreSQL)
 library(pool)
 library(config)
 library(plotly)
 library(data.table)

Sys.setenv(R_CONFIG_ACTIVE = "xyz")
config <- config::get()

pool <- dbPool(
drv = dbDriver("PostgreSQL"),
host = config$host,
dbname = config$dbname,
port = config$port,
user = config$user,
password = config$password
)

onStop(function() {
poolClose(pool)
})

get_data <- function(pool) {
abc <- dbGetQuery(pool,"SELECT * FROM tablename") #Query to pull data
return(abc)
}
abc <- get_data(pool = pool)

ui <- dashboardPage(
dashboardHeader(
title = 'Dashboard'
),
dashboardSidebar(
sidebarMenu(
  menuItem("pqr", tabName = "pqrs")
)
),
dashboardBody(
tabItems(
  tabItem(
    tabName = 'pqrs',
    hemaTab("pqr",abc = abc)
)
)
)
)

server <- function(input, output, session) {
pollData <- reactivePoll(60000, session,
                         checkFunc = function() {
                           print("Entered Check")
                           Sys.time()
                           print(Sys.time())
                         },
                         valueFunc = function() {
                           print("Entered value")
                           get_data(pool)
                         }
 )
 order(input, output, session, data = pollData())
 }

 shinyApp(ui = ui, server = server)

pqrs.R

pqrs <- function(id, label = "pqr",pqrs) {
ns <- NS(id)
tabPanel('pqr',
       tabsetPanel(
       tabPanel('Downloads',
                fluidPage(
                fluidRow(
                  column(12,
                         DT::dataTableOutput("table")
                  )
                )
                )
       )
       )
  )
  }

order <- function(input, output, session, data) {
downloaddata <- reactive({
setDT(data) 
})
output$table <- DT::renderDataTable( DT::datatable({
downloaddata()
})
)
}

I get the following result after running the app
"Entered Check"
[1] "2018-12-20 09:53:06 EST"
[1] "Entered Check"
[1] "2018-12-20 09:53:07 EST"
[1] "entered value"
After 1 minute the dashboard gets refreshed and I get the following 
result
[1] "Entered Check"
[1] "2018-12-20 09:54:07 EST"

Со следующей минуты приборная панель НЕ обновляется, но запускается функция проверки и отображается время.

1 Ответ

0 голосов
/ 20 декабря 2018

tl; dr: Попробуйте поместить функцию order(), которая вызывает poolData() внутри функции observe()

Я полагаю, что проблема связана стот факт, что reactivePoll, в отличие от того, как он работает, должен быть вызван внутри реактивной среды, чтобы нормально функционировать.

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

library(shiny)
ui <- fluidPage(
    mainPanel(
        verbatimTextOutput('text')
    )
)

server <- function(input, output, session) {
    pollData <- reactivePoll(600,session,
                             checkFunc = function() {
                                 print("Entered Check")
                                 Sys.time()
                                 print(Sys.time())
                             },
                             valueFunc = function() {
                                 print("entered value")
                                 return('x')
                             }
    )
    ord <- function(data) {
        print(data)
    }

    ord(isolate(pollData()))    # 1: Only triggers once
    # observe(ord(pollData()))  # 2: Triggers every time
}
shinyApp(ui = ui, server = server)

[1] "Entered Check"
[1] "2018-12-20 09:39:35 PST"
[1] "entered value"
[1] "x"
[1] "Entered Check"
[1] "2018-12-20 09:39:35 PST"
[1] "Entered Check"
[1] "2018-12-20 09:39:36 PST"
...

Но если я использую окружение, использую Second Way выше (оборачивая вызов ord в функцию observe), тогда он работает как положено:

[1] "Entered Check"
[1] "2018-12-20 09:41:50 PST"
[1] "Entered Check"
[1] "2018-12-20 09:41:50 PST"
[1] "entered value"
[1] "x"
[1] "Entered Check"
[1] "2018-12-20 09:41:50 PST"
[1] "entered value"
[1] "x"

Я предполагаю, что происходит то, что reactivePoll работает как любое другое выражение reactive*: когда оно вызывается, оно проверяет, является ли оно недействительным.Если это не так, он возвращает сохраненное значение;если это так, то он запускается снова и возвращает обновленное значение.

Я думаю, что происходит, когда checkFunc обнаруживает изменение, он не сообщает valueFunc, что он запускается напрямую, онпросто лишает законной силы reactive*.Как только он признан недействительным, valueFunc запускается при вызовеЕсли вы никогда не называете это (поскольку вас интересуют только побочные эффекты), то valueFunc не запускается.


В вашем случае, я думаю (по любой причине) реактивная среда создалаshinydashboard функционирует подобно первому варианту: достаточно как реактивная среда, чтобы получить доступ к значению функции reactivePoll, но она не вызывает valueFunc.Окружив функцию order функцией observe*, вы будете продолжать проверять и вызывать функцию.

...