持续更新的闪亮系统调用

时间:2017-10-19 19:15:20

标签: r shiny

我有一个闪亮的应用程序,使系统调用启动第二个进程,在这种情况下是一个c ++程序(由于各种原因Rcpp不是这个项目的选项)。 c ++程序需要一些时间才能运行,但会给终端提供连续的(每秒几次)反馈。

我可以从闪亮的应用程序执行程序并检索系统调用的输出,但它会一直等到进程完成。

现在我的问题是,有没有办法不断更新闪亮应用中的文字?

作为一个例子,我有以下闪亮的应用程序

ui <- bootstrapPage(
  verbatimTextOutput("text")
)

server <- function(input, output) {
  a <- system("./tmp", intern = T, wait = F)
  output$text <- renderText(paste(a, collapse = "\n"))
}

shinyApp(ui = ui, server = server)

以及以下c ++代码(使用tmp.cpp编译的g++ tmp.cpp -o tmp

#include <unistd.h>
#include <stdio.h>

int main() {
    for (int i = 0; i < 10; ++i) {
        printf("i is now %i\n", i); // print the current state
        fflush(stdout);             // force the print
        usleep(1000000);            // sleep for one second
    }
    return 0;
}

等待十秒后,输出显示,而我希望显示每一步。

对此有何想法/解决方案?非常感谢!

1 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样,我主张通过文本文件在C ++和闪亮之间建立联系。我的回答here向您展示了如何导入文件&#34;被动地&#34;。以下内容改编自相关答案中的选项4。

请注意,对于每个连接的用户,此过程都会启动一次,因此您可能希望通过将行system("./tmp > mytext.txt", intern = F, wait = FALSE)移至global.R来调整此代码。

ui <- bootstrapPage( 
  verbatimTextOutput("text") 
) 

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

  system("./tmp > mytext.txt", intern = F, wait = FALSE) 

  observe({ 
    ## read the text file once every 50 ms
    invalidateLater(50, session)
    req(file.exists("mytext.txt")) 
    txt <- paste(readLines("mytext.txt"), collapse = "\n") 
    output$text <- renderText(txt) 
  }) 
} 

shinyApp(ui = ui, server = server)