Будущее / обещания и получение результатов - PullRequest
0 голосов
/ 24 августа 2018

У меня блестящее приложение, которое использует довольно длинную функцию, которая периодически печатает обновления на консоли. Я хотел бы сделать Render () в блестящее окно, чтобы пользователь знал, что работа еще не завершена. Мне удалось заставить эту систему работать на macOS High Sierra 10.13.6 и shinyapps.io, как и ожидалось.

Но при попытке запустить это на моем Mint Linux или Ubuntu 18.04 Shiny Server регистрация не обновляется в режиме реального времени, а печатается сразу после завершения вызова функции. Я думаю, что это проблема ОС с блокировкой файлов, потому что несколько процессов обращаются к одному временному файлу, но я также понимаю, что shinyapps.io использует Ubuntu, поэтому я не знаю, есть ли параметр разрешения, который я могу изменить, чтобы разрешить это приложение для работы, как ожидалось.

Я не знаю тонны о разрешениях файлов Unix и блокировке файлов, поэтому, если у кого-то есть какие-либо предложения, они будут очень благодарны, спасибо!

edit: После еще одного взгляда появляется, что это работает только с plan(multicore)

Ниже приведен минимальный рабочий пример, подтвержденный работой на macOS High Sierra 10.13.6 и shinyapps.io:

.

ui.R

library(shiny)

fluidPage(
  mainPanel(
    actionButton("run", "Run"),
    div(id="outDiv", verbatimTextOutput("consoletext")),
    tags$head(tags$style("#outDiv{overflow-y:scroll; max-height: 100px;}")),
    tags$script(
      '
      Shiny.addCustomMessageHandler("scrollCallback",
      function(color) {
      var objDiv = document.getElementById("outDiv");
      objDiv.scrollTop = objDiv.scrollHeight;
      }
      );'
    )

    )
)

server.R

library(shiny)
library(future)
library(promises)
library(rprintf)
plan(multiprocess)
library(Rcpp)
sourceCpp("test.cpp")

tmpfile <- tempfile()

function(input, output, session) {
  observeEvent(input$run, {
    sink(tmpfile, type=c("output", "message"), append=FALSE)
    future({
      test()
       }) %...>% 
      (function(x) {
        print("Complete")
      })
    sink()
  })

  log <- reactiveFileReader(50, session=session, tmpfile, read.delim, sep="\n")
  output$consoletext <- renderPrint({
    try(
        suppressWarnings(print(log())), silent=TRUE)

    session$sendCustomMessage(type = "scrollCallback", 1)
  })
}

test.cpp

#include <Rcpp.h>
#include <unistd.h>
using namespace Rcpp;

// [[Rcpp::export]]
void test()
{
  for (int i=0; i<5; i++) {
    Rprintf("Step: %i\n", i);
    usleep(3000000);
  }
}

sessionInfo ()

R version 3.4.4 (2018-03-15)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Rcpp_0.12.17   rprintf_0.2.1  promises_1.0.1 future_1.8.1   shiny_1.1.0   

loaded via a namespace (and not attached):
 [1] codetools_0.2-15 listenv_0.7.0    digest_0.6.15    later_0.7.2      mime_0.5         R6_2.2.2        
 [7] xtable_1.8-2     jsonlite_1.5     magrittr_1.5     rlang_0.2.1      stringi_1.2.2    tools_3.4.4     
[13] parallel_3.4.4   httpuv_1.4.3     rsconnect_0.8.8  compiler_3.4.4   globals_0.11.0   htmltools_0.3.6 
...