Return Networkd3 桑基图中的节点名称 (R/Shiny)

Return node name in a Networkd3 Sankey Chart (R/Shiny)

我的 R/Shiny 应用程序中有一个 networkd3 Sankey 图,它从 MySQL 连接中提取数据。我正在尝试找到一种方法 'drill-down' 进入图表 - 单击一个节点,这将 return 节点的名称。然后,我将使用它向数据库传递另一个查询,该查询将在应用程序中填充 table。

这是我的 -

san <- sankeyNetwork(Links = sanData, Nodes = nodes, Source = "source",
    Target = "target", Value = "value")

这绘制的图表效果很好。

这是我到目前为止尝试过的 -
使用 R 包 htmlwidgets,并在我的 sankey 图表上使用 onRender 运行 以下 JS 脚本。

JS 脚本的占位符:

clickFun <- 'd3.selectAll(".link").on("click",function(d) {alert(d.value);})'

在我的 sankey 输出中:
onRender(san, clickFun)

这 return 是 link 的值作为警报。我尝试按照其他一些示例的建议使用 ".node"d.data.name,但我始终无法使其正常工作,也没有弹出警报。

这是我的问题:
1. 如何在鼠标单击时从桑基图中检索节点名称?
2. 假设我已经实现了上述目标,我如何在闪亮的应用程序中使用我的 JS 脚本编辑的值 return?我会将 alert() 位更改为 return(),但我不知道如何在我的服务器应用程序中使用它。

您的点击事件在链接上起作用但在节点上不起作用的原因是因为节点还具有附加到它们的拖动行为。解决这个问题的最简单方法是取消拖动行为,然后添加点击行为,就像这样...

library(networkD3)
library(htmlwidgets)

URL <- paste0('https://cdn.rawgit.com/christophergandrud/networkD3/',
              'master/JSONdata/energy.json')
energy <- jsonlite::fromJSON(URL)

san <- 
  sankeyNetwork(Links = energy$links, Nodes = energy$nodes, Source = 'source',
              Target = 'target', Value = 'value', NodeID = 'name',
              units = 'TWh', fontSize = 12, nodeWidth = 30)

clickFun <- 
  'function() { 
      d3.selectAll(".node").on("mousedown.drag", null);
      d3.selectAll(".node").on("click",function(d) { alert(d.name); })
   }'

onRender(san, clickFun)

这是一个工作示例,其中 onclick 事件 returns 被单击节点的名称,然后传递给处理 SQL 命令和 returns 结果的 R 函数到数据表命令,它显示从该节点跟随的链接...

library(shiny)
library(networkD3)
library(DT)
library(sqldf)
library(htmlwidgets)

URL <- paste0('https://cdn.rawgit.com/christophergandrud/networkD3/',
              'master/JSONdata/energy.json')
energy <- jsonlite::fromJSON(URL)

energy$links$name <- energy$nodes$name[energy$links$source + 1]
df <- energy$links

funct <-
  function (n) {
    isp <- sprintf("Select * From df Where df.name='%s';", n)
    isd <- sqldf::sqldf(isp)
    return(isd)
  }

ui <- shinyUI(fluidPage(
  fluidRow(
    column(4, sankeyNetworkOutput("sankey")),
    column(4, DT::dataTableOutput("table"))
  )
))

server <- shinyServer(function(input, output, session) { 
  session$onSessionEnded(stopApp)
  output$sankey <- renderSankeyNetwork({
    san <- 
      sankeyNetwork(Links = energy$links, Nodes = energy$nodes, Source = 'source',
                    Target = 'target', Value = 'value', NodeID = 'name',
                    units = 'TWh', fontSize = 12, nodeWidth = 30)

    clickFun <- 
      'function() { 
          d3.selectAll(".node").on("mousedown.drag", null);
          d3.selectAll(".node").on("click",function(d) { Shiny.onInputChange("id", d.name); });
        }'

    onRender(san, clickFun)
  })

  output$table <- DT::renderDataTable(DT::datatable(funct(input$id)))
})

shinyApp(ui = ui, server = server)