R Shiny - 带有点击事件的sankey情节

时间:2017-01-14 00:01:31

标签: javascript r javascript-events shiny googlevis

我试图创建一个带有Sankey情节的R闪亮仪表板。我希望能够提取被点击节点的名称。

有2个库可以绘制Sankey图,networkD3googleVisnetworkD3允许您监控点击事件,即使在同一个库中实现的其他类型的绘图带有此类功能(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

非常感谢提前!

1 个答案:

答案 0 :(得分:5)

我将分享一些有关我如何调试此内容的详细信息,因为您不熟悉JavaScript,它可以在将来为您提供帮助。

首先,我向sankey_click添加了一个console.log语句,以查看我们正在处理的对象类型。在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

所以,现在我们可以看到你为什么要返回一个对象了。事实上,点击是返回一个对象数组,每个对象都有一个属性名称&#39;。然后,一旦你知道这一点,这是一个简单的解决方案。只需更改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'))

当你不知道发生了什么时,只需要一种处理Shiny Javascript的方法。