R Shiny - 带有点击事件的桑基图

R Shiny - sankey plot with click events

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

有两个库可以绘制桑基图,networkD3googleVisnetworkD3 确实允许您监视点击事件,即使在同一库中实现的另一种类型的绘图具有此类功能 (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

我将分享一些关于我如何调试它的细节,因为你是新手 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'))

那么,现在我们可以了解您返回对象的原因了。实际上,点击返回一个对象数组,每个对象都有一个 属性 'name'。然后,一旦您知道了这一点,它就很容易解决。只需更改 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'))

当你不知道发生了什么事时,这只是处理闪亮 Javascript 的一种方法。