使用对选择输入有反应的sankey图表创建闪亮的应用程序

时间:2019-08-02 18:58:13

标签: r shiny reactive sankey-diagram

我正在尝试创建一个具有Sankey图和selectInput的仪表板,让最终用户选择过滤源列。我在尝试弄清楚如何使用反应性表达式过滤数据时遇到麻烦。这有点复杂,因为它不仅是读取数据的第一步,还需要进行预处理。我已经尝试将电抗滤波器放在最后,但它不起作用,如下所示。我还尝试使每个步骤都具有反应性,但这肯定是行不通的。

从某种意义上来说,这是行不通的:1)仪表板已加载,但没有图(应该是schname的默认值/第一个值)和2)当我选择另一个schname时,它给出了一个“闭包类型的对象”不可子集”错误。我认为这意味着我对反应式表达的处理方式有误,但是我还没有从所有搜索中弄清楚。

代表:

library(shiny)
ui <- fluidPage(
  selectInput(inputId = "school",
              label   = "School",
              choices =  c("alpha", "echo")),

  sankeyNetworkOutput("diagram")
)

server <- function(input, output) {

  dat <- data.frame(schname = c("alpha", "alpha", "alpha", "echo"),
                    next_schname = c("bravo", "charlie", "delta", "foxtrot"),
                    count = c(1, 5, 3, 4))

  links <- data.frame(source = dat$schname,
                      target = dat$next_schname,
                      value  = dat$count)
  nodes <- data.frame(name = c(as.character(links$source),
                               as.character(links$target)) %>%
                        unique)

  links$IDsource <- match(links$source, nodes$name) - 1
  links$IDtarget <- match(links$target, nodes$name) - 1

  links <-reactive({
    links %>%
      filter(source == input$school)
  })


  output$diagram <- renderSankeyNetwork({
    sankeyNetwork(
      Links = links,
      Nodes = nodes,
      Source = "IDsource",
      Target = "IDtarget",
      Value = "value",
      NodeID = "name",
      sinksRight = FALSE
    )
  })
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

我认为在反应性和非反应性数据帧之间分隔links的对象名称很重要。其次,对于render函数,您希望像函数一样调用反应对象:links()。第三,确保为应用程序加载了所有依赖项。

例如:

library(shiny)
library(networkD3)
library(dplyr)
ui <- fluidPage(
  selectInput(inputId = "school",
              label   = "School",
              choices =  c("alpha", "echo")),

  sankeyNetworkOutput("diagram")
)

server <- function(input, output) {

  dat <- data.frame(schname = c("alpha", "alpha", "alpha", "echo"),
                    next_schname = c("bravo", "charlie", "delta", "foxtrot"),
                    count = c(1, 5, 3, 4))

  links <- data.frame(source = dat$schname,
                      target = dat$next_schname,
                      value  = dat$count)
  nodes <- data.frame(name = c(as.character(links$source),
                               as.character(links$target)) %>%
                        unique)

  links$IDsource <- match(links$source, nodes$name) - 1
  links$IDtarget <- match(links$target, nodes$name) - 1

  links2 <-reactive({
    links %>%
      filter(source == input$school)
  })


  output$diagram <- renderSankeyNetwork({
    sankeyNetwork(
      Links = links2(),
      Nodes = nodes,
      Source = "IDsource",
      Target = "IDtarget",
      Value = "value",
      NodeID = "name",
      sinksRight = FALSE
    )
  })
}

shinyApp(ui = ui, server = server)