2017-10-19 8 views
0

私は、第2のプロセス(この場合はRcppはこのプロジェクトのオプションではないさまざまな理由から)を開始するシステムコールを行う光沢のあるアプリケーションを持っています。 C++プログラムは実行に時間がかかりますが、端末に連続して(2回/秒で)フィードバックを与えます。継続的な更新を伴う光沢のあるシステムコール

私は、光沢のあるアプリからプログラムを実行し、システムコールの出力を取得できますが、プロセスが終了するまで待機します。

私の質問は、輝くアプリの中のテキストを継続的に更新する方法はありますか?

例として、私は、次の光沢アプリ

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) 

及び10秒待機した後(g++ tmp.cpp -o tmpでコンパイルtmp.cppで)次のC++コード

#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

C++出力をテキストファイルとして保存し、そのファイルを「反応的に」読み込むことができます。私の答え[ここ](https://stackoverflow.com/questions/46719268/shiny-app-does-not-reflect-changes-in-update-rdata-file/46747407#46747407)(オプション4)を参照してください。 –

+0

それは完璧に見える、あなたが短い答えを書くなら、私は喜んでupvoteし、それを受け入れるだろう。 – David

答えて

1

コメントで示唆されているように、私はC++とテキストファイルによる光沢のある接続を推奨します。私の答えhereは "反応的に"ファイルをインポートする方法を示しています。以下は、リンクされた回答のオプション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) 
関連する問題