我正在尝试使用Sankey图创建R Shiny 的仪表板。我希望能够提取单击的节点的名称。
有2个可绘制Sankey图的库networkD3
和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
。提前谢谢了!
最佳答案
由于您是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'))
因此,现在我们可以看到您为什么返回一个对象。实际上,单击是返回对象的数组,每个对象都有一个属性“名称”。然后,一旦知道这一点,这是一个简单的修复。只需更改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的一种方法。