2013-06-26 21 views
36

Shiny GUI Rパッケージを使用しています。私は、actionButtonが押された後、 "loading ..."のようなメッセージを表示する方法を探しています。関数の実行には数分かかるので、ボタンが実際に何らかのイベントをトリガしたことをユーザーに何らかの形で伝える必要があります。今server.Rコードは次のようになります。R shiny:機能実行中に "loading ..."というメッセージが表示されます

DATA <- reactive({ 
    if(input$DownloadButton>0) { 
    RunDownload() 
    } else { 
    NULL 
    } 
}) 

output$Download <- renderText({ 
    if(NROW(DATA())>0) { 
    paste0(Sys.time(),": ",NROW(DATA()), " items downloaded") 
    } else { 
    '' 
    } 
}) 

actionButton()は機能、インターネットからのダウンロードデータです。 input$DownloadButtonはactionButtonです。ボタンが押された後、ユーザーは数分間待ってから、ダウンロードが成功したというメッセージが表示されます。 actionButtonの直後に「Loading ...」というメッセージを表示し、実行が終了するとpaste0(Sys.time(),": ",NROW(DATA()), " items downloaded")のような別のメッセージを表示したいと思います。

+0

私はあなたに進捗バーが必要だと思うものを簡略化するために、Rにはそれを関数に追加する多くの方法があります。進行状況バーを追加する方法を知るために 'RunDownload'のバージョンを用意できますか? – dickoa

+0

私はプログレスバーを必要としません、それはバイナリプログレスバーと呼ぶことができます。私は2つのメッセージを表示する必要があります:1つは機能開始時で、もう1つは機能終了時です。私はShinyパッケージを使用していることをメッセージ本体で指定するのを忘れてしまったと思います.Rコードだけではありません。今修正する予定です。 – user1603038

答えて

28

私は既に以前に投稿したものよりも簡単で信頼性の高い方法を使用しています。

conditionalPanel(condition="$('html').hasClass('shiny-busy')", 
       tags$div("Loading...",id="loadmessage") 
) 

例と

tags$style(type="text/css", " 
      #loadmessage { 
      position: fixed; 
      top: 0px; 
      left: 0px; 
      width: 100%; 
      padding: 5px 0px 5px 0px; 
      text-align: center; 
      font-weight: bold; 
      font-size: 100%; 
      color: #000000; 
      background-color: #CCFF66; 
      z-index: 105; 
      } 
    ") 

の組み合わせ:

runApp(list(
    ui = pageWithSidebar(
     headerPanel("Test"), 
     sidebarPanel(
      tags$head(tags$style(type="text/css", " 
      #loadmessage { 
       position: fixed; 
       top: 0px; 
       left: 0px; 
       width: 100%; 
       padding: 5px 0px 5px 0px; 
       text-align: center; 
       font-weight: bold; 
       font-size: 100%; 
       color: #000000; 
       background-color: #CCFF66; 
       z-index: 105; 
      } 
      ")), 
      numericInput('n', 'Number of obs', 100), 
      conditionalPanel(condition="$('html').hasClass('shiny-busy')", 
          tags$div("Loading...",id="loadmessage")) 
     ), 
     mainPanel(plotOutput('plot')) 
), 
    server = function(input, output) { 
    output$plot <- renderPlot({ Sys.sleep(2); hist(runif(input$n)) }) 
    } 
)) 

タグ$ヘッドは、()は必要ありませんが、それはすべてのスタイルを維持することをお勧めします内側のヘッドタグ

+0

ページ内の 'renderDataTable'テーブルに何か類似していることがありますか? – 719016

+0

このソリューションが大好きですが、私は 'shinydashboard 'でうまく動作しません。なぜどんなアイデア?開発者コンソールでは、条件が発生するのを見ることができますが、 'conditionalPanel'の周りに多くの異なる場所とラッパーを試していますが、実際にメッセージを表示することはできません。 – ClaytonJY

+0

誰かが同じ質問をした場合、私はこのバグの回避策を採用し、 'shinydashboard 'で動作するプログレスバーをもっと自然に見て自然に使うようにしました:https://github.com/rstudio/shiny/issues/609 – ClaytonJY

4

I)は、(sidebarPanelに次のコードを追加することで、問題を解決:

HTML('<script type="text/javascript"> 
     $(document).ready(function() { 
      $("#DownloadButton").click(function() { 
      $("#Download").text("Loading..."); 
      }); 
     }); 
     </script> 
') 
2

私は私のために正常に動作解決策を見つけました。私はBootstrapモーダルを使用しています。関数の実行が開始すると表示され、終了すると再び非表示になります。

modalBusy < - 機能(ID、タイトル、...){

msgHandler = singleton(tags$head(tags$script('Shiny.addCustomMessageHandler("jsCode", 
              function(message) { 
               console.log(message) 
               eval(message.code); 
              });' 
              ) 
           ) 
        ) 

label_id = paste(id, "label", sep='-') 
modal_tag <- div(id=id, 
       class="modal hide fade", 
       "aria-hidden"=FALSE, 
       "aria-labelledby"=label_id, 
       "role"="dialog", 
       "tabindex"="-1", 
       "data-keyboard"=FALSE, 
       "data-backdrop"="static") 
header_tag <- div(class="modal-header", 
       h3(id=label_id, title)) 
body_tag <- div(class="modal-body", 
       Row(...)) 
footer_tag <- div(class="modal-footer") 
modal_tag <- tagAppendChildren(modal_tag, header_tag, body_tag, footer_tag) 
tagList(msgHandler, modal_tag) 
} 

表示するには、それが機能

showModal <- function(id,session) { 
    session$sendCustomMessage(type="jsCode", 
          list(code= paste("$('#",id,"').modal('show')" 
              ,sep=""))) 
} 

hideModal <- function(id,session) { 
    session$sendCustomMessage(type="jsCode", 
          list(code= paste("$('#",id,"').modal('hide')" 
              ,sep=""))) 
} 

は前showModal関数を呼び出し使う非表示にしますあなたの関数呼び出しとその後のhideModal関数!

これが役に立ちます。

セブ

+0

私はこれを動作させることができません。 @Seb実際の例を共有してください。ありがとう – guna

3

あなたはShinyJSを使用することができます。https://github.com/daattali/shinyjs

actionButtonが押された場合、あなたは簡単に「...ロード」を示すテキストコンポーネントを切り替えることができ、計算が終了すると、あなたは、隠されたこのコンポーネントを切り替えることができます。

関連する問題