R Shiny — простой сюжет с событиями кликов

Я пытаюсь создать R блестящую информационную панель с графиком Санки. Я хочу иметь возможность извлечь имя щелкнутого узла.

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

Однако в пакете googleVis есть функция gvisSankey, которая может создавать графики Санки, и в качестве опции вы можете передать параметр 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.


person IVR    schedule 14.01.2017    source источник


Ответы (1)


Я поделюсь некоторыми подробностями о том, как я отлаживал это, поскольку вы новичок в 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'))

введите описание изображения здесь

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

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

введите описание изображения здесь

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

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

Просто один из способов справиться с Shiny Javascript, когда вы не знаете, что происходит.

person danielson    schedule 14.01.2017
comment
Если бы я мог, я бы дал вам 100 голосов за этот ответ, спасибо! Вы не просто дали мне ответ, вы показали мне, как решать подобные проблемы в будущем. - person IVR; 14.01.2017