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