2017-09-29 68 views
7

olayları plot_ly dağılım grafiği ile Parlak bir uygulama yapıyorum. Ben arsa ve datatable (DT) arasında bilgi paylaşmak için bir SharedData nesnesi (crosstalk paketinden) kullanıyorum.R Çizgisel tıklatma olaylarının görsel yanıtını devre dışı bırakın

Sorun, çizimdeki bir noktayı tıklattığınızda, diğer tüm noktaların rengini karartır ve seçilen noktaya efsaneye bir giriş ekler ve bu gerçekleşirse bir yol görünmez. geri almak için. Bu görsel değişiklikleri devre dışı bırakmak istiyorum ama yine de komplo tıklamalarını tespit edebiliyorum.

Sadece plot_ly çağrısının veri parametresinde bir SharedData nesnenin yerine reaktif data.frame kullanırsanız bu sorun oluşmaz, ama sonra arsadan event_datadatatable bir satır seçmek için yeterli bilgiye sahip değil . (. x ve y nokta koordinatları beklenmeyen sonuçlar edebilmek için bu veri karşı koordinatlara göre eşleştirme, nokta sayısal yüzen) İşte

demo mtcars kullanıyor: olur Neden

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) 

cevap

2

beni aşar ama İki olası geçici çözüm görebiliyorum.


Kuvvet 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 
     })  
     } 

dezavantajı tüm işaretlerin opacity: grafik titreşimler.


filterRows ifadenizi değiştirin. Verilerinizi bilmiyorum ama mtcars için carb (curveNumber aracılığıyla) ve daha sonra pointNumber aracılığıyla filtreleyebilirsiniz.

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

İlk çözüm gerçekten çok iyi çalışmıyor, ancak ikinci en azından bir "SharedData" nesnesi yerine bir "data.frame" kullanılarak bir geçici çözüm olarak yaklaşıyor. Bu benim ilk lütuf teklifimdir, bu yüzden burada protokolden biraz emin değilim. SO meta'lerini kontrol etmem gerekebilir, ancak şu an için ödül vereceğim ama yine de 'SharedData' nesnesinin kullanımına izin veren adresleri doğrudan yanıtlayan ve çözümün görsel cevabını devre dışı bırakan bir cevap için beklemeye devam ediyorum. . Teşekkür ederim! –

+0

Teşekkürler! Daha iyi bir cevap bulursam kod üzerinde biraz daha çalışmaya çalışacağım ve daha sonra güncelleyeceğim. –