我试图创建一个带有Sankey情节的R闪亮仪表板。我希望能够提取被点击节点的名称。
有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
。
非常感谢提前!
答案 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'))
所以,现在我们可以看到你为什么要返回一个对象了。事实上,点击是返回一个对象数组,每个对象都有一个属性名称&#39;。然后,一旦你知道这一点,这是一个简单的解决方案。只需更改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的方法。