Как избежать обновления данных при вставке новой вкладки - Shinyapp Dashboard - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь создать shinyapp, в котором пользователь может добавить столько новых вкладок, сколько потребуется, и провести анализ данных.В приложении-прототипе мне удалось добавить новые вкладки и нарисовать разные графики, используя разные наборы параметров

Но проблема в том, что если я начну с, скажем, 2 вкладок и подготовил какие-то графики в этих вкладках иЯ хочу добавить еще одну вкладку, чтобы выполнить другой анализ, в момент создания третьей вкладки графики на первых двух вкладках восстанавливаются.

Пожалуйста, помогите мне решить эту проблему с регенерированием существующих вкладок, когда новая вкладкадобавлено.

Рабочий код, как показано ниже.Пожалуйста, выберите значения в поле Имя вкладки, чтобы создать новую вкладку.

    library(shiny)
    library(plyr)
    library(dplyr)
    library(DT)
    library(data.table)
    library(shinydashboard)

    ui <- dashboardPage(
            dashboardHeader(title = 'mtcar anlyisis'),

            dashboardSidebar(sidebarMenu(
                    menuItem("Tab names", tabName = "tabnamesuiTab", icon = icon("table"))
            )),

            dashboardBody(tabItems(
                    tabItem(
                            tabName = 'tabnamesuiTab',
                            sidebarLayout(position = 'right',
                                          sidebarPanel(fluidRow(box(
                                                  fluidRow(column(12, uiOutput('tabnamesui')))
                                          ))),
                                          mainPanel(fluidRow(
                                                  splitLayout(cellWidths = c("100%"),
                                                              uiOutput("tabsets"))
                                          )))
                    )
            ))
    )


    server <- function(input, output, session) {
            mtcarsFile <- reactive({
                    input$mtcars
            })



            # )
            xxmtcars <- reactive({
                    as.data.table(mtcars)
            })


            tabsnames <- reactive({
                    names(xxmtcars())
            })

            output$tabnamesui <- renderUI({
                    selectInput(
                            'tabnamesui',
                            h5('Tab names'),
                            choices = as.list(tabsnames()),
                            multiple = T

                    )


            })

            YAxisValues <-
                    reactive({
                            names(xxmtcars()[, sapply(xxmtcars(), is.numeric)])
                    })


            tabnamesinput <- reactive({
                    input$tabnamesui
            })

            output$tabsets <- renderUI({
                    tabs <-
                            reactive({
                                    lapply(tabnamesinput(), function(x)
                                            tabPanel(
                                                    title = basename(x)
                                                    ,
                                                    fluidRow(
                                                            #splitLayout(cellWidths = c("20%", "20%","15%","15%","15%","15%")
                                                            column(2, uiOutput(
                                                                    paste0('ui1', x)
                                                            )),

                                                            column(2, uiOutput(
                                                                    paste0('calculationUi2', x)
                                                            )),
                                                            column(2, uiOutput(
                                                                    paste0('ui5', x)
                                                            )),
                                                            column(2, uiOutput(
                                                                    paste0('ui2', x)
                                                            )),
                                                            column(2, uiOutput(
                                                                    paste0('ui3', x)
                                                            )),
                                                            column(2, uiOutput(
                                                                    paste0('ui4', x)
                                                            ))
                                                    ),
                                                    fluidRow(#splitLayout(cellWidths = c("20%", "20%","20%","20%","20%")
                                                            column(
                                                                    2, uiOutput(paste0('ui6', x))
                                                            )),
                                                    fluidRow(
                                                            splitLayout(
                                                                    cellWidths = c("100%"),

                                                                    plotlyOutput(paste0('plot1', x))


                                                            )
                                                    )

                                            ))
                            })
                    do.call(tabsetPanel, c(tabs()))
            })




            #########
            observe(lapply(tabnamesinput(), function(x) {
                    output[[paste0('ui1', x)]] <-
                            renderUI({
                                    selectInput(
                                            paste0('ui1', x),
                                            h5('Measurement'),
                                            choices = YAxisValues(),
                                            multiple = F,
                                            width = '75%'
                                            # selected = 'wt'

                                    )
                            })
            }))

            observe(lapply(tabnamesinput(), function(x) {
                    output[[paste0('calculationUi2', x)]] <-
                            renderUI({
                                    selectInput(
                                            paste0('calculationUi2', x),
                                            h5('Calculation'),
                                            choices = c('sum', 'mean', 'min', 'max', 'count'),
                                            multiple = F,
                                            width = '75%'


                                    )
                            })
            }))

            observe(lapply(tabnamesinput(), function(x) {
                    output[[paste0('ui2', x)]] <-
                            renderUI({
                                    selectInput(
                                            paste0('ui2', x),
                                            h5('Colour'),
                                            choices = names(xxmtcars()),
                                            multiple = F,
                                            width = '75%'


                                    )
                            })
            }))
            observe(lapply(tabnamesinput(), function(x) {
                    output[[paste0('ui3', x)]] <-
                            renderUI({
                                    selectInput(
                                            paste0('ui3', x),
                                            h5('Mousehover info'),
                                            choices = names(xxmtcars()),
                                            multiple = F,
                                            width = '75%'


                                    )
                            })
            }))
            observe(lapply(tabnamesinput(), function(x) {
                    output[[paste0('ui4', x)]] <-
                            renderUI({
                                    selectInput(
                                            paste0('ui4', x),
                                            h5('PlotType'),
                                            choices = c('markers', 'lines+markers'),
                                            multiple = F,
                                            width = '75%'


                                    )
                            })
            }))




            #########

            #################
            subsetdata_x <- reactive({
                    list_of_subdata_x <- lapply(tabnamesinput(), function(x) {
                            as.data.table((select(xxmtcars(

                            ), x)))
                    })
                    names(list_of_subdata_x) <- tabnamesinput()
                    return(list_of_subdata_x)
            })



            subsetdata_y <- reactive({
                    list_of_subdata_y <- lapply(tabnamesinput(), function(x) {
                            as.data.table((select(
                                    xxmtcars(), input[[paste0('ui1', x)]]
                            )))
                    })
                    names(list_of_subdata_y) <- tabnamesinput()
                    return(list_of_subdata_y)
            })

            subsetdata_col <- reactive({
                    list_of_subdata_col <- lapply(tabnamesinput(), function(x) {
                            as.data.table((select(
                                    xxmtcars(), input[[paste0('ui2', x)]]
                            )))
                    })
                    names(list_of_subdata_col) <- tabnamesinput()
                    return(list_of_subdata_col)
            })

            subsetdata_hover <- reactive({
                    list_of_subdata_hover <- lapply(tabnamesinput(), function(x) {
                            as.data.table((select(
                                    xxmtcars(), input[[paste0('ui3', x)]]
                            )))
                    })
                    names(list_of_subdata_hover) <- tabnamesinput()
                    return(list_of_subdata_hover)
            })




            observe(lapply(tabnamesinput(), function(x) {
                    output[[paste0('plot1', x)]] <-
                    {
                            renderPlotly({
                                    cbind.data.frame(
                                            subsetdata_x()[[x]],
                                            subsetdata_y()[[x]],
                                            subsetdata_col()[[x]],
                                            subsetdata_hover()[[x]]
                                    ) %>% setnames(c('x', 'y', 'col', 'hover')) %>% group_by(x, col, hover) %>%
                                            summarize(y = sum(y)) %>% plot_ly(
                                                    x =  ~ x,
                                                    y =  ~ y,
                                                    type = 'scatter',
                                                    mode = input[[paste0('ui4', x)]],
                                                    marker = (list(size = 10)),
                                                    color =  ~ col,
                                                    text =  ~ paste(hover)

                                            ) %>% layout(autosize =
                                                                 T)
                            })
                    }


            }))




    }

    runApp(list(ui = ui, server = server))
...