R networkD3: щелкните действие, чтобы показать информацию из фрейма данных узла - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть этот код:

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)

Я выяснил, чтобы получить номер строки фрейма данных узла, запросив d.index + 1.Однако я хочу показать таблицу, содержащую всю информацию об узле, например так (возможно, лучше отформатированный):

    name group size     var1     var2
1 Myriel     1   15 1.501311 1.053062

Для этого потребуется JavaScript, чтобы иметь доступ к фрейму данных узла, как я толькоЯ немного знаю JavaScript, я не могу понять, как запросить эти данные.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Причина, по которой это происходит, заключается в том, что функция forceNetwork удаляет все ненужные переменные / столбцы во фрейме данных, которые она передает JavaScript, что обычно выгодно, но не в этом случае.Вы можете обойти это, сохранив объект htmlwidget, который создает forceNetwork, затем добавьте обратно в переменную, к которой вам нужно получить доступ, и затем напечатайте / отобразите его.

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

enter image description here


Это можно сделать также с / для нескольких переменных, например ...

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
0 голосов
/ 24 сентября 2018

К сожалению, я думаю, что это сделать нелегко, если не невозможно.Похоже, что только используемые аргументы 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)

Как вы можете видеть при нажатии на узелниже, var1 не определено.Примечание. Я добавил аргумент Nodesize к вызову функции, доступ к которому теперь можно получить через скрипт d.nodesize (а не d.size).Переменная и аргумент group, в этом случае, названы одинаково, поэтому различие здесь потеряно.Тем не менее, к NodeID, очевидно, обращаются по указанному имени, которое я нахожу несовместимым.

enter image description here

Вы можете увидеть сгенерированный источник, сохранив:

saveNetwork(d3, file = "test.html")

Вы можете заметить, посмотрев на него, что значения, которые вы намереваетесь вывести, не сохраняются в файле.

Редактировать:

По вашему собственному предположению, это приходитчто-то вроде обходного пути:

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)

enter image description here

Итак, нужно просто отформатировать строку так, как вы хотите, чтобы она отображалась.Недостатком является то, что name / NodeIDs очень длинные.И, как вы можете видеть, NodeID просто всегда называется name на стороне JS.

...