我正在尝试使用Sankey图创建R Shiny 的仪表板。我希望能够提取单击的节点的名称。

有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

提前谢谢了!

最佳答案

由于您是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'))

javascript - R Shiny-带有点击事件的sankey图-LMLPHP

因此,现在我们可以看到您为什么返回一个对象。实际上,单击是返回对象的数组,每个对象都有一个属性“名称”。然后,一旦知道这一点,这是一个简单的修复。只需更改sankey_click
  sankey_click <- sprintf("var text = chart.getSelection()[0]['name'];
 Shiny.onInputChange('%s', text.toString()); console.log(text);", session$ns('text'))

javascript - R Shiny-带有点击事件的sankey图-LMLPHP

当您满意时,请删除console.log
  sankey_click <- sprintf("var text = chart.getSelection()[0]['name'];
 Shiny.onInputChange('%s', text.toString());", session$ns('text'))

当您不知道发生了什么时,仅是处理Shiny Javascript的一种方法。

08-27 09:49