2016-05-13 9 views
1

ユーザーが列ハイチャートプロットのバーをクリックすると、いくつかの情報を検出したいと考えています。凡例で名前が選択された場合、または背景がクリックされた場合は、クリックしたバーの名前とカテゴリを知る必要があります。名前の部分は大丈夫ですが、このタイプの情報を知るために書く必要があるJSコードはどれですか。私は無効にするには、列を有効にした直後にクリックするとハイチャートの列rの光沢のあるプロットのクリックしたバーに関する情報を知る方法

感謝

library("shiny") 
library("highcharter") 

ui <- shinyUI(
    fluidPage(
    column(width = 8, highchartOutput("hcontainer", height = "500px")), 
    column(width = 4, textOutput("text")) 
) 
) 

server <- function(input, output) {  

    a <- data.frame(b = LETTERS[1:10], c = 11:20, d = 21:30, e = 31:40) 

    output$hcontainer <- renderHighchart({  

    myClickFunc <- JS("function(event) {Shiny.onInputChange('hcClicked', this.name);}") 

    highchart() %>% 
     hc_xAxis(categories = a$b) %>% 
     hc_add_serie(name = "c", data = a$c) %>% 
     hc_add_serie(name = "d", data = a$d) %>% 
     hc_add_serie(name = "e", data = a$e) %>% 
     hc_plotOptions(series = list(stacking = FALSE, events = list(click = myClickFunc))) %>% 
     hc_chart(type = "column") 

    })  

    output$text <- renderText({ 
    input$hcClicked   
    }) 
} 

新しい質問 は、私は2番目のイベントを検出することはできません。 列や凡例が無効にされて有効にされている(またはその逆)場合は、他のどのイベントも途中で検出することはできますか?

その他の質問は:プロットの背景のクリックを検出することは可能ですか?

おかげ

答えて

5

は、私はおそらく、詳細にあなたは、どのような可能性をあなたが持つことができるかについて、この時間をより多くを行く:

highchartイベント関数は、常にフォームJS("function(event) { ... }")を持っています。 JSはJavaScriptを表し、Rが内部のコードを解釈するのを防ぎます。幸いなことに、JavaScriptはRのように見えます。これはJavaScriptを知らなくても文を書くのを簡単にします。

内部関数は常にeventパラメータを持つ必要があります。 highchartsのドキュメントから、このイベントにはいくつかのプロパティがありますが、最も重要なのはpointです。 JavaScriptのプロパティには、と同様にドット.でアクセスできます。event.pointは、クリックしたポイントになります。

今、この点も多くのプロパティを持っていますが、そのほとんどは非常に有用ではありません。しかし、使用する可能性のある値は、軸値ごとにcategory,color,xおよびyです。したがって、クリックしたポイントのy値を知りたい場合は、event.point.yがコマンドです。別の例:あなたのケースではevent.point.xxの値を返します。棒グラフの場合はcategoryではなく、categoryのインデックスです(ここでは0から始まります)。前の例(コードスニペット)では、オブジェクトthisも使用しました。 thisは、クリックされたseriesの略です。これは単なるショートカットです。これは、event.point.seriesでシリーズを取得することもできるからです。シリーズ自体には、例えばnameのような多くのプロパティがあります。

JavaScriptに関する注意:JavaScriptのリスト(配列)は、角括弧[ ... ]で作成されます。私は1つのコマンドで複数の値を送信するために、以下のコードでこれを使用しました。

これが最初の部分です。今、選択肢をあなたの光沢のあるアプリに伝えたいと思っています。シャイニーはこの目的のために情報チャネルを内蔵しています。 1つはJavaScript関数Shiny.onInputChangeです。この関数には2つの引数があり、2つ目は送信したい値です。最初の名前は後で値にアクセスする名前です。したがって、使用方法は常にShiny.onInputChange('myVar', value)です。この値はサーバーに送信され、input$myVarの下にアクセスできます。そこには、他の入力と同じ規則があります。反応する環境にinput$myVarを入れて、新しい何かがinput$myVarに送信されたときに反応します。

ダイレクトリクエストについて:クリックした値がどのカテゴリに属しているかを知るには、最初のクリック機能をちょっと変えてください。 (私はその機能に合わせて関数の名前を変更しました)上記の説明は理解できるはずです。 2番目の機能は、凡例のクリックとともに、highchartsに組み込まれた別のイベント「スロット」を使用します。 legendItemClickは通常のclickと同じように動作しますが、凡例のクリックだけを再生します。ホバーイベントが必要な場合は、割り当て可能なイベントハンドラーがいくつかあります(mouseOver)。

敬具

library("shiny") 
library("highcharter") 

ui <- shinyUI(
    fluidPage(
    column(width = 8, highchartOutput("hcontainer", height = "500px")), 
    column(width = 4, textOutput("text")) 
) 
) 

server <- function(input, output) {  

    a <- data.frame(b = LETTERS[1:10], c = 11:20, d = 21:30, e = 31:40) 

    output$hcontainer <- renderHighchart({  

    canvasClickFunction <- JS("function(event) {Shiny.onInputChange('canvasClicked', [this.name, event.point.category]);}") 
    legendClickFunction <- JS("function(event) {Shiny.onInputChange('legendClicked', this.name);}") 

    highchart() %>% 
     hc_xAxis(categories = a$b) %>% 
     hc_add_series(name = "c", data = a$c) %>% 
     hc_add_series(name = "d", data = a$d) %>% 
     hc_add_series(name = "e", data = a$e) %>% 
     hc_plotOptions(series = list(stacking = FALSE, events = list(click = canvasClickFunction, legendItemClick = legendClickFunction))) %>% 
     hc_chart(type = "column") 

    })  

    makeReactiveBinding("outputText") 

    observeEvent(input$canvasClicked, { 
    outputText <<- paste0("You clicked on series ", input$canvasClicked[1], " and the bar you clicked was from category ", input$canvasClicked[2], ".") 
    }) 

    observeEvent(input$legendClicked, { 
    outputText <<- paste0("You clicked into the legend and selected series ", input$legendClicked, ".") 
    }) 

    output$text <- renderText({ 
    outputText  
    }) 
} 

shinyApp(ui, server) 
+0

グレート:

さて、ここで私が上に書いたもののために働くの例を与えるためのサンプルコードです!ありがとうございました! – hsilva

+0

非常にgooooodの答え! – jbkunst

関連する問題