2016-06-19 18 views
5

光沢のある反応式は、必要なところで変化を伝播します。 isolateでこの動作の一部を抑制できますが、私たち自身の論理式に基づいて変更が伝播するのを抑止できますか?条件付き反応性シャイニー

私が与える例は、単純な散布図であり、ユーザがクリックする十字線をablineで描画します。残念ながら、Shinyは結果を新しいプロットと見なし、クリック値はNULL ...にリセットされます。これは通常どおり伝搬される値の更新として扱われます。プロットは再描画され、NULLが両方の引数のablineに渡されます。

クリック数が0以外の場合にのみ、プロット座標の非反応変数を更新する条件をrenderPlot呼び出しに配置することです(下にコメントアウトします)。NULLこれは簡単なプロットではうまく動作しますが、実際にはプロットが2度描かれます。

これを行うにはどのような方法が良いですか? が正しいですか?方法はありますか?

Serverファイル:

library(shiny) 

shinyServer(function (input, output) 
{ 
    xclick <- yclick <- NULL 
    output$plot <- renderPlot({ 
    #if (!is.null(input$click$x)){ 
     xclick <<- input$click$x 
     yclick <<- input$click$y 
    #} 
    plot(1, 1) 
    abline(v = xclick, h = yclick) 
    }) 
}) 

UIファイル:

library(shiny) 

shinyUI(
    basicPage(
    plotOutput("plot", click = "click", height = "400px", width = "400px") 
) 
) 
+0

あなた 'if'ステートメントはこの例であなたがやりたいように見えるので、 –

+0

' renderPlot'はあなたやりたい、やや静的では動作しない場合の例を提供するためには良いかもしれません'rCharts'や' highcharter'のようなより進んだライブラリを使うべきです。 –

+0

[this](http://shiny.rstudio.com/reference/shiny/latest/actionButton.html)のように? – alistaire

答えて

2

ウィンストンが蓄積この問題「状態」を呼び出す - あなたがいないだけで、現在のデータを表示したいのですが、前のプロットによって生成された何か(これについて学ぶのに最適な場所はhttps://www.rstudio.com/resources/videos/coordinated-multiple-views-linked-brushing/です)

基本的な考え方は、独自のリアクティブ値のセットを作成し、ユーザはプロットをクリックする。次回のクリックまで無効にはならないので、あなたは循環的な振る舞いをしません。

library(shiny) 

shinyApp(
    shinyUI(basicPage(plotOutput("plot", click = "click"))), 
    function(input, output) { 
    click <- reactiveValues(x = NULL, y = NULL) 
    observeEvent(input$click, { 
     click$x <- input$click$x 
     click$y <- input$click$y 
    }) 

    output$plot <- renderPlot({ 
     plot(1, 1) 
     abline(v = click$x, h = click$y) 
    }) 
    } 
) 
+0

ありがとう!これから私たちは私たち自身の論理的表現で無効化をコントロールできないのですか?私はこの解決策が 'ignoreNULL = TRUE'のobserveEventに依存していると仮定し、一般的なケースでは' input $ click $ x'が2か何かであれば更新を抑止できませんでした。これが当てはまる場合は、質問を編集して循環的な動作を停止する方法をさらに詳しく説明します。 –

+0

することはできますが、それはよりトリッキーです。新しい質問をする方がいいかもしれないと思う – hadley

関連する問題