如何在閃亮的儀表板中引用多個 DiagrammeR GraphViz 圖形

喬希

我有一個閃亮的儀表板,其中包含多個邏輯鏈接的選項卡,因此我使用 GraphViz 創建了一個 DiagrammeR 圖來顯示它們之間的關係。我希望能夠在 GraphViz 圖中的節點之一上註冊單擊事件時觸發對新選項卡的更改。

該圖表將位於每個選項卡的頂部,因此有多個圖表需要點擊。

我已經完成了大部分工作,如這個 reprex 所示:

library(shinydashboard)
library(DiagrammeR)
library(shinyjs)

ui <- dashboardPage(
  dashboardHeader(title = "DiagrammeR buttons"),
  dashboardSidebar(
    sidebarMenu(id = "tabs",
                menuItem("Tab 1", tabName = "one", icon = icon("dice-one")),
                menuItem("Tab 2", tabName = "two", icon = icon("dice-two"))
    )
  ),
  dashboardBody(
    useShinyjs(),
    tabItems(
      tabItem(tabName = "one",
        fluidRow(box(grVizOutput("diagram_a", width = "100%", height = "100%"), width = 12))
        ),
      tabItem(tabName = "two",
        fluidRow(box(grVizOutput("diagram_b", width = "100%", height = "100%"), width = 12))
        )
      )
    )
  )

server <- function(input, output, session) {
  
  output$diagram_a <- renderGrViz({grViz("digraph {
  graph[rankdir = LR]
  node [style = filled]
  n1_1 -> n1_2
  }")})
  
  output$diagram_b <- renderGrViz({grViz("digraph {
  graph[rankdir = LR]
  node [style = filled]
  n2_1 -> n2_2
  }")})
  
  observeEvent(eventExpr = input$clickednode, {
    updateTabItems(session, "tabs", input$clickednode)
  })

  observe({
    local({
      clicked = "Shiny.onInputChange('clickednode', 'one')"
      shinyjs::onclick("node1",runjs(clicked))
      })
    local({
      clicked = "Shiny.onInputChange('clickednode', 'two')"
      shinyjs::onclick("node2",runjs(clicked))
      })
  })
}

shinyApp(ui, server)

唯一的問題是只有儀表板中的第一個圖表會註冊點擊事件。本示例中的第二個選項卡只是一個無法與之交互的靜態圖表。

我需要一些幫助確保我指的是具體的node1node2我感興趣的,而不是僅僅是第一node1node2出現在儀表盤上。我不確定如何在 JavaScript 中做到這一點。

注意: nodeX其中X的數字是閃亮自動提供給每個 graphViz 圖中節點的 id。這可以通過檢查儀表板 html 找到。

lz100
  1. 為每個節點使用唯一的ID。在 HTML 中,應該強烈避免重複的 ID。即使您將每個圖的文本更改為n1_1n2_1,默認 ID 始終為node1, node2, node3... 您需要手動更改它。
  2. 建議:使用setInputValue代替onInputChange

以下是如何為 GraphViz 中的每個節點設置唯一 ID。看看GraphViz 語法會有幫助。

library(shinydashboard)
library(DiagrammeR)
library(shinyjs)

ui <- dashboardPage(
  dashboardHeader(title = "DiagrammeR buttons"),
  dashboardSidebar(
    sidebarMenu(id = "tabs",
                menuItem("Tab 1", tabName = "one", icon = icon("dice-one")),
                menuItem("Tab 2", tabName = "two", icon = icon("dice-two"))
    )
  ),
  dashboardBody(
    useShinyjs(),
    tabItems(
      tabItem(tabName = "one",
              fluidRow(box(grVizOutput("diagram_a", width = "100%", height = "100%"), width = 12))
      ),
      tabItem(tabName = "two",
              fluidRow(box(grVizOutput("diagram_b", width = "100%", height = "100%"), width = 12))
      )
    )
  )
)

server <- function(input, output, session) {
  
  output$diagram_a <- renderGrViz({grViz('digraph {
  graph[rankdir = LR]
  node [style = filled]
  n1_1 -> n1_2
  n1_1[id="d1_n1"]
  n1_2[id="d1_n2"]
  }')})
  
  output$diagram_b <- renderGrViz({grViz('digraph {
  graph[rankdir = LR]
  node [style = filled]
  n2_1 -> n2_2
  n2_1[id="d2_n1"]
  n2_2[id="d2_n2"]
  }')})
  
  observeEvent(input$clickednode, {
    updateTabItems(session, "tabs", input$clickednode)
  })
  
  observe({
    local({
      clicked = "Shiny.setInputValue('clickednode', 'one')"
      shinyjs::onclick("d1_n1",runjs(clicked)) 
      shinyjs::onclick("d2_n1",runjs(clicked))
    })
    local({
      clicked = "Shiny.setInputValue('clickednode', 'two')"
      shinyjs::onclick("d1_n2",runjs(clicked)) 
      shinyjs::onclick("d2_n2",runjs(clicked))
    })
  })
}

shinyApp(ui, server)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章