Javascript R networkD3:单击“操作”以显示节点数据框中的信息

Javascript R networkD3:单击“操作”以显示节点数据框中的信息,javascript,r,networking,htmlwidgets,networkd3,Javascript,R,Networking,Htmlwidgets,Networkd3,我有以下代码: library(networkD3) # Load data data(MisLinks) data(MisNodes) new.nodes <- MisNodes new.nodes$var1 <- runif(nrow(MisNodes),1,2) new.nodes$var2 <- runif(nrow(MisNodes),1,2) # Some script to show the node index in the new.nodes data

我有以下代码:

library(networkD3)

# Load data
data(MisLinks)
data(MisNodes)

new.nodes <- MisNodes
new.nodes$var1 <- runif(nrow(MisNodes),1,2)
new.nodes$var2 <- runif(nrow(MisNodes),1,2)

# Some script to show the node index in the new.nodes data frame
script <- 'alert("row: " + (d.index + 1));'

# Plot
forceNetwork(Links = MisLinks, Nodes = new.nodes,
             Source = "source", Target = "target",
             Value = "value", NodeID = "name",
             Group = "group", opacity = 0.8,
             clickAction = script)

这将要求JavaScript能够访问节点数据帧,因为我对JavaScript知之甚少,我不知道如何请求这些数据

不幸的是,我认为这不是不可能的,也是不容易做到的。在底层代码中,似乎只有与节点相关的
forceNetwork
参数中使用的参数被初始化:

例如,考虑:

script <- 'alert("row: "     + (d.index + 1) + 
                 ", name: "  + d.name + 
                 ", group: " + d.group + 
                 ", size: "  + d.nodesize + 
                 ", var1: "  + d.var1)'

# Plot
d3 <- forceNetwork(Links = MisLinks, Nodes = new.nodes,
             Source = "source", Target = "target",
             Value = "value", NodeID = "name", 
             Nodesize = "size",
             Group = "group", opacity = 0.8,
             clickAction = script)

print(d3)
通过查看它,您可以注意到您想要输出的值没有存储在文件中

编辑: 根据您自己的建议,这有点像一个解决办法:

new.nodes$newname  <- with(new.nodes, paste(", name: ", name, ", group: ", group, 
                                ", size: ", size, ", var1: ", var1,
                                ", var2: ", var2))

newscript <- 'alert("row: " + (d.index + 1) + d.name)'

forceNetwork(Links = MisLinks, Nodes = new.nodes,
             Source = "source", Target = "target",
             Value = "value", NodeID = "newname", Nodesize = "size",
             Group = "group", opacity = 0.8, opacityNoHover = 0,
             clickAction = newscript)

new.nodes$newname发生这种情况的原因是
forceNetwork
函数去掉了它传递给JavaScript的数据帧中所有不必要的变量/列,这通常是有利的,但在这种情况下并非如此。您可以通过保存
forceNetwork
创建的htmlwidget对象来解决此问题,然后将其添加回需要访问的变量,然后“打印”或显示它

library(networkD3)

data(MisLinks)
data(MisNodes)

MisNodes$var1 <- runif(nrow(MisNodes),1,2)

script <- 'alert("var1: " + (d.var1));'

fn <- forceNetwork(Links = MisLinks, Nodes = new.nodes, Source = "source", 
                   Target = "target", Value = "value", NodeID = "name", 
                   Group = "group", opacity = 0.8, clickAction = script)

fn$x$nodes$var1 <- MisNodes$var1

fn
库(networkD3)
数据(错误链接)
数据(错误节点)

MisNodes$var1也许我可以将所有变量合并成一个字符串(并用分隔符分隔),然后将其用作NodeID,并使用JS从d.name分割数据?(但不知道如何在JS中实现这一点)。设置opacityNoHover=0将是明智的,否则整个文本将出现。我猜这可能会起作用,是的。但是为什么不在R端制作所需的字符串呢?我刚刚尝试过,它确实有效。请看编辑后的帖子。我想这是一个可以接受的“黑客行为”。很好!那就行了it@CodeNoob很高兴我能帮忙。如果它回答了你的问题,请考虑接受它。AAAH尼斯解决方案!美好的你知道这有没有记录在案?
forceNetwork
返回一个htmlwidget,或者一个htmlwidget是可编辑的,这绝对不是一个秘密,但具体地说,在我所知的任何地方(除了这里,现在)都没有记录这种黑客行为
new.nodes$newname  <- with(new.nodes, paste(", name: ", name, ", group: ", group, 
                                ", size: ", size, ", var1: ", var1,
                                ", var2: ", var2))

newscript <- 'alert("row: " + (d.index + 1) + d.name)'

forceNetwork(Links = MisLinks, Nodes = new.nodes,
             Source = "source", Target = "target",
             Value = "value", NodeID = "newname", Nodesize = "size",
             Group = "group", opacity = 0.8, opacityNoHover = 0,
             clickAction = newscript)
library(networkD3)

data(MisLinks)
data(MisNodes)

MisNodes$var1 <- runif(nrow(MisNodes),1,2)

script <- 'alert("var1: " + (d.var1));'

fn <- forceNetwork(Links = MisLinks, Nodes = new.nodes, Source = "source", 
                   Target = "target", Value = "value", NodeID = "name", 
                   Group = "group", opacity = 0.8, clickAction = script)

fn$x$nodes$var1 <- MisNodes$var1

fn
library(networkD3)

data(MisLinks)
data(MisNodes)

MisNodes$var1 <- runif(nrow(MisNodes),1,2)
MisNodes$var2 <- runif(nrow(MisNodes),1,2)

script <- 'alert("var1: " + d.var1 + "\\n" + "var2: " + d.var2);'

fn <- forceNetwork(Links = MisLinks, Nodes = new.nodes, Source = "source", 
                   Target = "target", Value = "value", NodeID = "name", 
                   Group = "group", opacity = 0.8, clickAction = script)

fn$x$nodes$var1 <- MisNodes$var1
fn$x$nodes$var2 <- MisNodes$var2

fn