2017-01-14 2 views
3

Я пытаюсь создать R блестящую панель инструментов с заговором Санки. Я хочу иметь возможность извлечь имя щелкнутого узла.R Shiny - sankey plot with click events

Существует 2 библиотеки, которые могут отображать диаграммы Санки,и googleVis. networkD3 позволяет отслеживать события кликов, хотя другой тип сюжета, реализованный в той же библиотеке, поставляется с такой функцией (forceNetwork()).

googleVis пакет однако имеет функцию gvisSankey, которая может создавать участки sankey, и в качестве опции вы можете передать параметр gvis.listener.jscode, который должен быть способен его захватить.

Боюсь, я не знаком с JS, и я изо всех сил пытаюсь получить то, что я ищу. Это насколько мне удалось получить:

library(shiny) 
library(googleVis) 

datSK <- data.frame(From=c(rep("A",3), rep("B", 3)), 
        To=c(rep(c("X", "Y", "Z"),2)), 
        Weight=c(5,7,6,2,9,4)) 

SERVER <- function(input, output, session){ 
    sankey_click <- sprintf("var text = chart.getSelection(); 
Shiny.onInputChange('%s', text.toString())", session$ns('text')) 
    output$sankey <- renderGvis(
    gvisSankey(datSK, from="From", to="To", weight="Weight", 
       options=list(gvis.listener.jscode = sankey_click, 
          sankey = "{node: {interactivity: true, width: 50}}")) 
) 

    click_event <- reactive({input$text}) 
    output$click <- renderText(click_event()) 

} 

UI <- fluidPage(
    fluidRow(column(12, htmlOutput("sankey"))), 
    fluidRow(column(12, verbatimTextOutput("click"))) 
) 

shinyApp(ui = UI, server = SERVER) 

Как вы можете видеть, все это я получаю object Object.

Большое спасибо заранее!

ответ

3

Поделитесь некоторыми сведениями о том, как я отлаживал это, так как вы новичок в JavaScript, и он, надеюсь, поможет вам в будущем.

Во-первых, я добавил инструкцию console.log для sankey_click, чтобы узнать, с каким объектом мы имеем дело. В Chrome вы можете открыть консоль с помощью Ctrl + Shift + J.

sankey_click <- sprintf("var text = chart.getSelection(); 
Shiny.onInputChange('%s', text.toString()); console.log(text);", session$ns('text')) 

enter image description here

Итак, теперь мы можем понять, почему вы возвращаете объект. На самом деле щелчок возвращает массив объектов, каждый из которых имеет свойство «имя». Затем, это простое решение, как только вы это знаете. Просто измените sankey_click

sankey_click <- sprintf("var text = chart.getSelection()[0]['name']; 
Shiny.onInputChange('%s', text.toString()); console.log(text);", session$ns('text')) 

enter image description here

и когда вы удовлетворены, удалите console.log

sankey_click <- sprintf("var text = chart.getSelection()[0]['name']; 
Shiny.onInputChange('%s', text.toString());", session$ns('text')) 

Только один способ справиться с Блестящая Javascript, когда вы не знаете, что продолжается.

+0

Я бы дал вам 100 голосов за этот ответ, если бы мог, спасибо! Вы не просто дали мне ответ, вы показали мне, как разрешать подобные проблемы в будущем. – IVR