R Shiny - 带有点击事件的桑基图
R Shiny - sankey plot with click events
我正在尝试创建一个带有桑基图的 R 闪亮的仪表板。我希望能够提取被点击节点的名称。
有两个库可以绘制桑基图,networkD3
和 googleVis
。 networkD3
确实允许您监视点击事件,即使在同一库中实现的另一种类型的绘图具有此类功能 (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 的一种方法。
我正在尝试创建一个带有桑基图的 R 闪亮的仪表板。我希望能够提取被点击节点的名称。
有两个库可以绘制桑基图,networkD3
和 googleVis
。 networkD3
确实允许您监视点击事件,即使在同一库中实现的另一种类型的绘图具有此类功能 (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 的一种方法。