3

入力値を繰り返しカウントして変更することなく、所定の範囲の入力をインクリメントしながら一連の結果を表示するように、Shiny アプリの対話を自動化しようとしています。この自動化により、選択した銘柄の更新された価格チャートの表示や、監視されているリアルタイム プロセスの現在のパフォーマンス インジケーターのプロットなど、一連の入力の体系的なビューが提供されます。

これは、タイマーでループを実行する質問 [一定間隔でグラフ/プロットを更新する] (一定間隔でグラフ/プロットを更新する ) に似ています。そのアプローチを拡張して、私の目的は次のとおりです。a) 無効化後の一時停止を自動的に高く (1 時間) 設定して、固定 (5) セットの表示の後にサイクルを効果的に停止し、新しいユーザー入力を保留して再起動します。

b) [それができるようになったら、停止する前に一連の input$obs を循環するカウンター ベースのコントロールを追加します。簡単にするために、同じエラーとおそらく同じ解決策を持つそのステップはここでは省略されています。]

上記のおもちゃの例を使用すると、次のスクリプトは 5 つの表示を繰り返し循環しますが、一時停止間隔を変更するのではなく、このエラーが発生します。

ポート 8100 でリッスンする hist.default(dist, main = paste("Last Histogram count =", as.numeric(updater())) のエラー: 'x' は数値でなければなりません

as.numeric(autoControl()) エラー: 関数 "autoControl" が見つかりませんでした

このタスクに必要なリアクティブ コンダクター、reactiveValues、またはその他のメソッドが見つかりません。ご協力ありがとうございました。

library(shiny)

updates <- 0
updater <- function(){ updates + 1 }

runApp(list(
  ui = pageWithSidebar(    

  headerPanel("Hello Shiny!"),

  sidebarPanel(
    sliderInput("obs", 
      "Number of observations:", 
      min = 1,
      max = 1000, 
      value = 50)
    ,

    selectInput(inputId = "secPause",
        label = "Seconds between displays:",
        choices = c(1, 2, 3, 60*60),
        selected = 2)
  ),

  mainPanel(
    plotOutput("distPlot")
  )
),

  server =function(input, output, session) {
        updateTracker <- reactive( { 
            invalidateLater(as.numeric(input$secPause) * 1000, session)
            updates <<- as.numeric(updater())
        })

        autoControl <- reactive( {
            if(updateTracker() <= 5)
            secPause <<- input$secPause
                    else
                    secPause <<- 60*60
            return(secPause)
        })

    output$distPlot <- renderPlot( {
        if(updateTracker() <= 5) {
        # generate an rnorm distribution and plot it
        dist <- rnorm(input$obs)
        hist(dist, main = paste("Histogram count =" , updateTracker()))
        }
        else {
            updates <<- 0
            hist(dist, main = paste("Last Histogram count =", 
              as.numeric(updater()), "with secPause =", 
              as.numeric(autoControl())))
                }
    })
    }
))
4

1 に答える 1

1

hist分布が if 節内で定義されているため、エラーが発生していますが、定義されていない節内で (5 つの間隔の後) 使用していますelse。そのため、最初の 5 つの間隔で機能します。

   if(updateTracker() <= 5) {
        # generate an rnorm distribution and plot it
        dist <- rnorm(input$obs)
        hist(dist, main = paste("Histogram count =" , updateTracker()))
        }
        else {
            updates <<- 0
            hist(dist, main = paste("Last Histogram count =", 
              as.numeric(updater()), "with secPause =", 
              as.numeric(autoControl())))
                }

ディストをif条件の前に移動した後、サイクリングが機能するようになりました。(また、コードを UI.R と server.R に分割して、管理しやすくします。) 基本的に同じコードであるため、ここには貼り付けませんが、この gist でコードの動作バージョンを見つけることができます

于 2013-09-05T19:34:56.240 に答える