Javascript 在Networkd3 Sankey图表中返回节点名称(R/s)

Javascript 在Networkd3 Sankey图表中返回节点名称(R/s),javascript,r,shiny,networkd3,Javascript,R,Shiny,Networkd3,我的R/Shining应用程序中有一个networkd3 Sankey图,它从MySQL连接中提取数据。我正在试图找到一种方法“深入”到图表中-单击一个节点,这将返回该节点的名称。然后,我将使用它将另一个查询传递给DB,DB将在应用程序中填充一个表 这是我所拥有的- san <- sankeyNetwork(Links = sanData, Nodes = nodes, Source = "source", Target = "target", Value = "value")

我的R/Shining应用程序中有一个networkd3 Sankey图,它从MySQL连接中提取数据。我正在试图找到一种方法“深入”到图表中-单击一个节点,这将返回该节点的名称。然后,我将使用它将另一个查询传递给DB,DB将在应用程序中填充一个表

这是我所拥有的-

san <- sankeyNetwork(Links = sanData, Nodes = nodes, Source = "source",
    Target = "target", Value = "value")
在我的sankey输出中:
onRender(san,clickFun)

这将链接的值作为警报返回。我尝试使用其他一些示例所建议的
“.node”
d.data.name
,但我始终无法使其工作,并且没有弹出警报

以下是我的问题:
1.如何在鼠标单击时从sankey绘图中检索节点的名称?

2.假设我已经实现了上述目标,那么如何在我的应用程序中使用JS脚本返回的值呢?我将把
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)
库(networkD3)
库(htmlwidgets)

URL Hi Rangarajan,如果你能用一个。这让其他人更容易帮助你解决问题。谢谢,这很有魅力。但是,如何在应用程序中使用javascript函数返回的值?我想在我的SQL查询中的where子句中传递它。我不确定它是如何传递的,也许我遗漏了什么。有没有一种方法可以直接使用javascript脚本(在我的例子中是clickFun)以字符串的形式返回的内容?请仔细看看
Shining会发生什么。onInput
Bit尝试我上面添加的新示例,它与我在另一篇文章中指出的示例非常相似。闪亮的.onInputChange以及它如何与整个东西一起工作是我所缺少的。我在JS脚本中尝试使用return()。添加了
shining.onInputChange(“id”,d.name)
到javascript,并且
input$id
允许我访问它。这足够我从这里开始工作了。谢谢
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)
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)