2017-06-07 24 views
1

散布図のマーカーをユーザーがクリックした後に、Plotlyのevent_data("plotly_click")を使用して(モーダルを開く)処理を行います。その後(例えばモーダルを閉じる)、event_data("plotly_click")は同じマーカを変更してクリックしないので、同じ動作を再度トリガすることはありません。同じプロットマーカーを2回クリックするとイベントが2回トリガーされない

最小例:

library(plotly) 
ui <- fluidPage( 
    plotlyOutput("plot") 
) 
server <- function(input, output, session) { 
    output$plot <- renderPlotly({ 
    mtcars %>% plot_ly(x=~disp, y=~cyl) 
    }) 

    # Do stuff after clicking on a marker in the plot 
    observeEvent(event_data("plotly_click"), { 
    print("do some stuff now") # this is not executed after second click on same marker 
    }) 
} 
shinyApp(ui, server) 

私は(マーカーをクリックしたとき、それはプロットの空の領域で正常に機能しますが、ではない)無駄に、shinyjsのonclickでの回避策を試してみました:

shinyjs::onclick(id="plot", print("clicked")) 

私はまた、最後のクリックを保存し、直後にリセットされる(例えばevent_data("plotly_hover")によって)反応値を使用しようとしましたが、event_data("plotly_click")が古い値のままであるため、すべての試行が失敗します。

誰でも手助けできますか?

+0

私はこれが知っている問題だと思うhttps://community.plot.ly/t/reseting-click-events/2718 –

+0

ありがとう、しかし、それは彼らのフォーラムで唯一の質問への単なるリンクです。似たようなものです: – shosaco

答えて

2

私はついにこの問題を解決しました。

基本的に私はshinyjsパッケージを使って、特定のイベントで最後のクリック(event_data("plotly_click")が情報を取得するソース)に関するデータをリセットします。私の場合はボタン)。そして、これはjs$resetClick()でボタンクリック時に呼ばれ

extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('.clientValue-plotly_click-A', 'null'); }") 

関数の定義は、(「A」が使用されている場合plotly・ソース文字列に置換する必要があることに注意してください)です。

最小例:

library(shiny) 
library(plotly) 
library(shinyjs) 

ui <- shinyUI(
    fluidPage(
    useShinyjs(), 
    # code to reset plotlys event_data("plotly_click", source="A") to NULL -> executed upon action button click 
    # note that "A" needs to be replaced with plotly source string if used 
    extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('.clientValue-plotly_click-A', 'null'); }"), 
    actionButton("reset", "Reset plotly click value"), 
    plotlyOutput("plot"), 
    verbatimTextOutput("clickevent") 
) 
) 


server <- shinyServer(function(input, output) { 

    output$plot <- renderPlotly({ 
    plot_ly(mtcars, x=~cyl, y=~mpg) 
    }) 

    output$clickevent <- renderPrint({ 
    event_data("plotly_click") 
    }) 

    observeEvent(input$reset, { 
    js$resetClick() 
    }) 
}) 

shinyApp(ui, server) 

enter image description here

0

私は同じ問題を抱えていた、と難易この例のjavascriptの部分が動作するようになっていました。しかし、私が使用し終わった創造的な解決策は、plotlyオブジェクトの "source"引数を以下のように無効な値に指定することでした:plot_ly(data、x、y、...、source = x)とevent_data(。 ..、source = x)xをreactiveValuesオブジェクトの要素とします。イベントがトリガされたときは、xの値(インクリメントまたはハッシュ)を変更するだけで、新しいevent_data()オブジェクトをインスタンス化します。魅力のように働いた。

+0

あなたの答えのコード部分をフォーマットするためにあなたの答えを更新することを検討してください。それは可読性に役立ちます。編集画面の右側に、フォーマットのヒントが表示されます。 – Bek

関連する問題