我正在尝试创建一个带有Sankey情节的R闪亮仪表板.我希望能够提取被点击的节点的名称.
有2个库可以绘制Sankey图表,networkD3
和googleVis
.networkD3
允许您监视单击事件,即使在同一个库中实现的其他类型的绘图带有此类功能(forceNetwork()
).
googleVis
但是gvisSankey
,package有一个可以创建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'))
所以,现在我们可以看到你为什么要返回一个对象.事实上,点击是返回一个对象数组,每个对象都有一个属性"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'))
当你不知道发生了什么时,只需要一种处理Shiny Javascript的方法.