У меня блестящее приложение, которое использует довольно длинную функцию, которая периодически печатает обновления на консоли. Я хотел бы сделать 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