互斥拖放图事件

时间:2017-10-04 15:00:44

标签: highcharts shiny r-highcharter

我有一个包含Highcharter图表的Shiny应用程序。该图是一个散点图,具有可拖动和可点击的点。理论上,与拖动相关的操作应与与点击相关的操作互斥。

然而,实际上,点击动作有时会在拖动一个点时触发。单击(不拖动)和拖动(这应该排除在鼠标按钮释放和拖动操作完成之前单击的能力)需要在此应用程序中互斥。我的完整代码根据事件的类型将不同的JavaScript操作传递回Shiny服务器。这两起事件一起发生了麻烦。

我怀疑该解决方案涉及添加与每个事件相关的其他JavaScript操作。但是,我的JavaScript技能不够强大,无法知道这些调整可能是什么。谷歌搜索这个问题的几个不同的变种并没有转变任何潜在的解决方案。我发现最接近的讨论是在Highcharts上下文中here,但解决方案与主Highchart / draggable-events JS文件有关。

建议?

对于您可以在行动中看到此行为的玩具示例:

rm(list=ls())
library(highcharter)
library(shiny)


ui <- fluidPage(
    highchartOutput("hcontainer")
)


# MUTUAL EXCLUSIVITY:
# if you drag in the plot, you should either drag (and get no alert) OR
# get an alert (and the point shouldn't/won't move), but never both.

server <- function(input, output, session) {
    output$hcontainer <- renderHighchart({
        hc <- highchart() %>% 
            hc_chart(animation = FALSE) %>% 
            hc_title(text = "draggable points demo") %>% 
            hc_plotOptions(
                series = list(
                    point = list(
                        events = list(
                            drop = JS("function(){    /* # do nothing, for demo */
                                      }"
                            ),
                            click = JS("function(){
                                alert('You clicked')  /* # give alert, for demo */
                                }"
                            ) 
                        )
                    ),
                    stickyTracking = FALSE
                ),
                column = list(
                    stacking = "normal"
                ),
                line = list(
                    cursor = "ns-resize"
                )
            ) %>% 
            hc_tooltip(yDecimals = 2) %>% 
            hc_add_series(
                type = "scatter",
                data = stars,
                draggableY = TRUE,
                draggableX = TRUE,
                hcaes(x = absmag, y=radiussun)
            )
        hc
    })
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

此示例可能会对您有所帮助:http://jsfiddle.net/kkulig/th37vnv5/

我在核心函数中添加了一个标志,可防止在拖动事件后立即触发单击操作:

dt <- fread(' time    hour Money day
20000616    1  9.35   5
20000616    2  6.22   5 
20000616    3  10.65  5
20000616    4  11.42  5
20000616    5  10.12  5
20000616    6  7.32   5')