Как отключить щелчок правой кнопкой мыши на Plotly-Object? - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу использовать контекстное меню ( jQuery contextMenu ) поверх объекта Plotly.Проблема заключается в том, что, когда я выбираю несколько элементов с помощью инструмента Box - или Lasso , а затем щелкаю правой кнопкой мыши по строке, она вызывает событие нажатия на этой панели ипредыдущий выбор потерян.

Как я могу предотвратить щелчок правой кнопкой мыши на объекте Plotly, поэтому щелчки левой кнопкой мыши вызывают событие щелчка / выбора, а щелчок правой кнопкой мыши зарезервирован только дляоткрытие контекстного меню?

enter image description here

Shiny-App:

library(shiny)
library(ggplot2)
library(plotly)

dfN <- data.frame(
  time_stamp = seq.Date(as.Date("2018-04-01"), as.Date("2018-07-30"), 1),
  val = runif(121, 100,1000),
  col = "green", stringsAsFactors = F
)

jsCode = HTML('
$(document).on("shiny:connected", function() {
    $(function() {
        $.contextMenu({
            selector: "#plot",
            callback: function(key, options) {
              switch(key){
                 case "copy":
                    console.log("Contextmenu: Copy was clicked");
                    break;
                case "paste":
                    console.log("Contextmenu: Paste was clicked");
                    break;
              }
            },
            items: {
              copy: {name: "copy", icon: "copy"},
              "paste": {name: "paste", icon: "paste"}
            }
          });
      });
});')


ui <- fluidPage(
  tags$head(tags$script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.7.1/jquery.contextMenu.min.js")),
  tags$head(tags$script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.7.1/jquery.ui.position.js")),
  tags$head(tags$link(rel="stylesheet", href="https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.7.1/jquery.contextMenu.min.css")),
  tags$head(tags$script(jsCode)),
  plotlyOutput("plot")
)

server <- function(input, output, session) {
  output$plot <- renderPlotly({
    key <- highlight_key(dfN)
    p <- ggplot() +
      geom_col(data = key, aes(x = plotly:::to_milliseconds(time_stamp), y = val, fill=I(col)))

    ggplotly(p, source = "Src") %>% 
      layout(xaxis = list(type = "date")) %>% 
      highlight(off = "plotly_doubleclick", on = "plotly_click", color = "blue",
                opacityDim = 0.5, selected = attrs_selected(opacity = 1))
  })
}

shinyApp(ui, server)

1 Ответ

0 голосов
/ 04 марта 2019

Я нашел решение, которое требует изменить базовый plotly.js файл пакета plotly.

Обычные щелчки сохраняются как d.event.buttons = 1, и, очевидно, правые щелчки d.event.buttons = 2.

Итак, в этом разделе;

graphDiv.on('plotly_click', function(d) {

});

Я вставил условие if, чтобы проверить, равен ли event.buttons 1, иначе щелчок не будет издан.

Это работает с текущим CRANверсия сюжета, теперь dev-версия немного отличается.

  if (d.event.buttons == 1) {
    // Normal Clicks
    Shiny.setInputValue(
      ".clientValue-plotly_click-" + x.source,
      JSON.stringify(eventDataWithKey(d))
    );
    graphDiv._shiny_plotly_click = d;            
  }
...