2017-09-29 46 views
7

我建立一个闪亮的应用与plot_ly散点图。我使用的是SharedData对象(从串扰包)共享的情节和datatable(从DT)之间的信息。禁用视觉反应Plotly单击事件

问题是,当您单击绘图中的一个点时,它会使所有其他点的颜色变暗,并为选定点的图例添加一个条目,一旦发生这种情况,似乎没有办法撤消它。我想禁用这些视觉变化,但仍然能够检测图点击。

,如果我只是在plot_ly调用的数据参数使用反应data.frame而不是SharedData对象不会发生此问题,但随后从情节event_data没有足够的信息在datatable选择一行。 (该xy点坐标是浮点数字,通过对数据坐标,以便匹配可以有意想不到的效果)

下面是一个使用演示mtcars

library(shiny) 
library(DT) 
library(plotly) 
library(data.table) 
library(crosstalk) 

### UI function --------- 
ui <- fluidPage(
    fluidRow(
    plotlyOutput('my_graph', height = '400px') 
), 
    fluidRow(
    dataTableOutput('my_table') 
) 
) 

### Server function ------- 
server <- function(input, output, session) { 

### SharedData object ---- 
    filtered_data <- reactive({ 
    data.table(mtcars, keep.rownames = TRUE) 
    }) 

    shared_data <- reactive({ 
    req(filtered_data()) 
    SharedData$new(filtered_data(), ~rn) 
    }) 

### my_graph ---- 
    output$my_graph <- renderPlotly({ 
    p <- plot_ly(shared_data(), 
       x = ~disp, 
       y = ~mpg, 
       color = ~factor(carb), 
       source = 'm') 
    p 
    }) 

### my_table --------- 
    output$my_table <- renderDataTable({ 
    datatable(shared_data()$data(), 
       selection = 'single') 
    }) 

    observe({ 
    click_detect = plotly::event_data('plotly_hover', source = 'm') 
    str(click_detect) 

    dataTableProxy('my_table') %>% 
     selectRows(match(click_detect$key, shared_data()$data()$rn)) 
    }) 
} 

shinyApp(ui, server) 

回答

2

为什么出现这种情况打败我,但我可以看到两种可能的解决方法。


力Plotly所有标记的不透明度设置为1

if (click_detect$curveNumber != 0) { 
     output$my_graph <- renderPlotly({ 
      p <- plot_ly(shared_data(), 
         x = ~disp, 
         y = ~mpg, 
         color = ~factor(carb), 
         source = 'm', 
         marker = list(opacity = 1)) 
      p 
     })  
     } 

缺点:图形闪烁。


更改您的filterRows声明。我不知道您的数据,但对于mtcars,您可以通过carb(通过curveNumber)然后通过pointNumber进行过滤。

dataTableProxy('my_table') %>% selectRows(
     which(mtcars$carb == sort(unique(mtcars$carb))[[click_detect$curveNumber + 1]])[[click_detect$pointNumber + 1]]) 
+0

第一个解决方案并没有真正的工作这么好,但第二次使用接近,至少作为一种解决方法了'data.frame'而不是'SharedData'对象。这是我的第一个赏金提议,所以我对这里的协议有点不确定。我可能需要检查SO元,但现在我会奖励赏金,但仍然支持直接解决允许使用'SharedData'对象的答案,并且仅禁用图形点击的视觉响应,而不是解决方法。谢谢! –

+0

谢谢!我会尝试更多地处理代码,稍后如果我找到更好的答案,请更新它。 –