57

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

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 が押された直後に「Loading...」というメッセージを表示しpaste0(Sys.time(),": ",NROW(DATA()), " items downloaded")、実行が終了したときのような別のメッセージを表示したいと思います。

4

6 に答える 6

42

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

の組み合わせ

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;
           }
  ")

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

例:

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)) })
  }
))

tags$head() は必須ではありませんが、head タグ内にすべてのスタイルを保持することをお勧めします。

于 2014-03-18T09:33:07.747 に答える
4

次のコードを sidebarPanel() に追加して問題を解決しました。

HTML('<script type="text/javascript">
        $(document).ready(function() {
          $("#DownloadButton").click(function() {
            $("#Download").text("Loading...");
          });
        });
      </script>
')
于 2013-06-27T08:56:20.450 に答える
3

ShinyJS を使用できます: https://github.com/daattali/shinyjs

actionButton を押すと、「loading...」と表示されているテキスト コンポーネントを簡単に切り替えることができ、計算が終了したら、このコンポーネントを非表示に切り替えることができます。

于 2016-08-19T02:33:39.580 に答える
2

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

modalBusy <- function(id, title, ...){

 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 関数を呼び出してください。

お役に立てれば。

セブ

于 2014-02-27T17:47:00.000 に答える