我有一个闪亮的应用程序,使系统调用启动第二个进程,在这种情况下是一个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;
}
等待十秒后,输出显示,而我希望显示每一步。
对此有何想法/解决方案?非常感谢!
答案 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)