2017-05-09 3 views
4

Ich versuche NetworkD3 und glänzend zu verwenden, um einige Daten zu visualisieren. Ich möchte eine Aktion ausführen, wenn ein Knoten in einem Diagramm angeklickt wird. Ich verwende ein diagonales Netzwerk, wie im folgenden Code gezeigt.Shiny & NetzwerkD3 reagiert auf Knoten klicken

Das forceNetwork verfügt über eine Option zum Ausführen einer "Klickaktion", um beim Klicken auf einen Knoten zu reagieren. Ich kann jedoch keine ähnliche Option für das diagonale Netzwerk finden. Gibt es eine andere Möglichkeit, dies zu implementieren?

Danke für Ihre Hilfe!

#### Load necessary packages and data #### 
 
library(shiny) 
 
library(networkD3) 
 

 
data(MisLinks) 
 
data(MisNodes) 
 

 
hc <- hclust(dist(USArrests), "ave") 
 
URL <- paste0(
 
    "https://cdn.rawgit.com/christophergandrud/networkD3/", 
 
    "master/JSONdata//flare.json") 
 

 

 

 
## Convert to list format 
 
Flare <- jsonlite::fromJSON(URL, simplifyDataFrame = FALSE) 
 

 

 
#### Server #### 
 
server <- function(input, output) { 
 

 
    output$simple <- renderDiagonalNetwork({ 
 
    diagonalNetwork(List = Flare, fontSize = 10, opacity = 0.9) 
 
    }) 
 
    
 

 
    output$force <- renderForceNetwork({ 
 
    forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source", 
 
       Target = "target", Value = "value", NodeID = "name", 
 
       Group = "group", opacity = input$opacity) 
 
    
 
    
 
    }) 
 
    
 
    ## 
 
    #dendroNetwork(hc, height = 600) 
 
# 
 
# dendroNetwork(hc, height = 500, width = 800, fontSize = 10, 
 
#    linkColour = "#ccc", nodeColour = "#fff", nodeStroke = "steelblue", 
 
#    textColour = "#111", textOpacity = 0.9, textRotate = NULL, 
 
#    opacity = 0.9, margins = NULL, linkType = c("elbow", "diagonal"), 
 
#    treeOrientation = c("horizontal", "vertical"), zoom = FALSE) 
 
    
 
    
 

 
} 
 

 
#### UI #### 
 

 
ui <- shinyUI(fluidPage(
 

 
    titlePanel("Shiny networkD3 "), 
 

 
    sidebarLayout(
 
    sidebarPanel(
 
     sliderInput("opacity", "Opacity (not for Sankey)", 0.6, min = 0.1, 
 
        max = 1, step = .1) 
 
    ), 
 
    mainPanel(
 
     tabsetPanel(
 
     tabPanel("Simple Network", diagonalNetworkOutput("simple")), 
 
     tabPanel("Force Network", forceNetworkOutput("force")) 
 
    ) 
 
    ) 
 
) 
 
)) 
 

 
#### Run #### 
 
shinyApp(ui = ui, server = server)

Antwort

3

Sie könnten htmlwidgets ‚s onRender Funktion verwenden, um ein onclick Ereignis an die Knoten wie folgt ...

library(shiny) 
library(networkD3) 
library(htmlwidgets) 

URL <- paste0(
    "https://cdn.rawgit.com/christophergandrud/networkD3/", 
    "master/JSONdata//flare.json") 
Flare <- jsonlite::fromJSON(URL, simplifyDataFrame = FALSE) 

clickJS <- 'd3.selectAll(".node").on("click", function(d){ alert(d.data.name); })' 

server <- function(input, output) { 
    output$simple <- renderDiagonalNetwork({ 
    onRender(diagonalNetwork(List = Flare, fontSize = 10, opacity = 0.9), clickJS) 
    }) 
} 

ui <- fluidPage(
    diagonalNetworkOutput("simple"), 
    tags$script(clickJS) 
) 

shinyApp(ui = ui, server = server) 
befestigen
Verwandte Themen