使用Shiny中的图动态创建选项卡

时间:2019-07-12 18:01:36

标签: r shiny

我想根据各自具有自己的网络图图(networkD3)的数据在Shiny中动态创建n个选项卡。每次调用该应用程序时,它都会读取具有不断变化的数据的csv。

理想情况下,将有一个选项卡显示一个包含所有组的图形,并且每个组及其关联节点都有一个单独的选项卡。

这是针对闪亮的应用程序。我能够为每个组动态创建一个选项卡,并在一个选项卡上显示所有组的图,但是a组和b组的选项卡为空。

#### Load necessary packages and data ####

library(shiny)
library(networkD3)


#### Server ####

server <- function(input, output) {

    nodes <- reactive({ # read_csv
        v <- data.frame(name = LETTERS[1:6],
                        id = c(0, 1, 2, 3, 4, 5),
                        group = c('a', 'a', 'a', 'b', 'b', 'b'),
                        stringsAsFactors = FALSE)
        return(v)
    })

    edges <- reactive({ #read csv
        e <- data.frame(source = c(0, 1, 2, 3, 4, 5, 0),
                        target = c(1, 2, 0, 4, 5, 3, 5),
                        width = rep(1, 7),
                        stringsAsFactors = FALSE)

        v <- nodes()

        groups <- v %>%
            select(group) %>%
            distinct(group) %>%
            arrange(group)

        groups = groups$group

        for (g in groups) {

            v_group <- filter(v, group == g)

            l <- filter(e, source %in% v_group$id | target %in% v_group$id)
            n <- filter(v, id %in% l$source | id %in% l$target)

            print(g)
            print(l)
            print(n)

            p <- renderForceNetwork({
                forceNetwork(Links = l,
                             Nodes = n,
                             Source = 'source',
                             Target = 'target',
                             NodeID = 'name',
                             Value = 'width',
                             Group = 'group',
                             opacity = 0.9,
                             zoom = TRUE,
                             arrows = TRUE,
                             opacityNoHover = 1,
                             fontSize = 14,
                             charge = -35)
            })

            appendTab(inputId = "tabs",
                      tabPanel(
                          g,
                          p
                      ) # tab panel
            ) # append tab
        }

        return(e)
    })

    output$force <- renderForceNetwork({
        forceNetwork(Links = edges(),
                     Nodes = nodes(),
                     Source = 'source',
                     Target = 'target',
                     NodeID = 'name',
                     Value = 'width',
                     Group = 'group',
                     opacity = 0.9,
                     zoom = TRUE,
                     arrows = TRUE,
                     opacityNoHover = 1,
                     fontSize = 14,
                     charge = -35)
    })
}


#### UI ####

ui <- shinyUI(
    fluidPage(
        titlePanel("Job graph"),
        mainPanel(
            tabsetPanel(
                id = 'tabs',
                tabPanel('All jobs',
                         fillPage(
                             tags$style(
                                 type = "text/css",
                                 "#force {height: calc(100vh - 100px) !important; width: calc(100vw - 100px) !important;}"),
                             forceNetworkOutput("force")
                         ) # fill page
                ) # tab panel
            ) # tabset Panel
        ) # main panel
    ) # fluid page
) # shiny ui


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

我除了类似的东西: 一个具有n个标签的仪表板,一个包含所有图解的标签,以及每个组和所有关联节点的一个标签。

在reprex中,将有三个选项卡。总而言之,组a的选项卡和组b的选项卡。

谢谢。

0 个答案:

没有答案