Shiny アプリで一連のイベントを作成するのに問題があります。この問題の一部を処理する他の方法 (JS を使用) と、同様の目的で使用できるさまざまな Shiny 関数 (例: ) があることは知っていますが、withProgress
これを反応性で機能させる方法を理解したいと思います。
私が達成したいフローは次のとおりです: 1) ユーザーがアクションボタンをクリックすると、A) 時間のかかる計算が開始され、B) 計算が開始されたことをユーザーに知らせる簡単なステートメントが UI に出力されます 2) 1 回計算が値を返すと、ユーザーに計算が完了したことを警告する前のテキスト出力への別の更新をトリガーします
アクション ボタンを使用してテキスト値を更新し、その値にオブザーバーを設定して計算を開始することを実験しました (1B が 1A の前に実行されるように)。計算は完了しましたが、何も機能していません。これが私の最新の試みです:
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
actionButton("run", "Pull Data")
mainPanel(
textOutput("status")
)
)
)
server <- function(input, output, session) {
# slow function for demonstration purposes...
test.function <- function() {
for(i in seq(5)) {
print(i)
Sys.sleep(i)
}
data.frame(a=c(1,2,3))
}
report <- reactiveValues(
status = NULL,
data = NULL
)
observeEvent(input$run, {
report$status <- "Pulling data..."
})
observeEvent(report$status == "Pulling data...", {
report$data <- test.function()
})
observeEvent(is.data.frame(report$data), {
report$status <- "Data pull complete"
}
)
observe({
output$status <- renderText({report$status})
})
}
最終的には、これを計算 + ユーザー入力のより長いサイクルに組み込むことを望んでいるので、この種の進行中の相互作用を処理するためのオブザーバー + 反応要素の適切なパターンを見つけたいと考えています。どんな助けでも大歓迎です!