【问题标题】:R Shiny: renderUI + uiOutput multiple inputs upon condition asynchronouslyR Shiny:renderUI + uiOutput多个输入条件异步
【发布时间】:2020-08-01 23:03:59
【问题描述】:

我正在创建一个应用程序。

目前我有一个用户界面,用户可以在其中按下按钮从数据库执行查询以获取数据。

数据被抓取后(需要很长时间)。我在抓取数据末尾使用future%...>% 函数创建了一个异步,以使用renderUI 自动加载更多ui(我计划根据抓取的数据使其动态)

到目前为止看起来像这样:

ui.R:

navbarPage("R",
           tabPanel("Summary",
                    sidebarLayout(
                        sidebarPanel(
                            selectInput( inputId = "dataset",
                                         label = "Choose dataset",
                                         choices = c("A")
                            ),

                            dateRangeInput( inputId = "date_range",
                                            start = "2007-01-01",
                                            end = "2009-01-01",
                                            format = "yyyy-mm-dd",
                                            label = "Observation Start and End Date",
                                            startview = "decade",
                                            autoclose = TRUE
                            ),


                            actionButton("update_data", "Load Data"),

                            uiOutput("observation_months"),

                            uiOutput("h_months")

                        ),

                        mainPanel(

                          verbatimTextOutput("summary"),

                          tableOutput("sample_view")

                        )
                    )
                    )




           )

server.R:

server <- function(input, output, session) {


    data <- eventReactive(  eventExpr = input$update_data, {

        mon = mongo(collection = "data", db = "test", url = "mongodb://uid:pw@localhost:27017")

        future({

            dat_dump <- mon$find( query = paste0(paste0(paste0(paste0('{"date": { "$gte" : { "$date" : "', strftime( input$date_range[1] , "%Y-%m-%dT%H:%M:%S%z")), '\" }, "$lt" : {"$date" : "'), strftime( input$date_range[2] , "%Y-%m-%dT%H:%M:%S%z")), '\"} }}'))




            dat_dump <- dat_dump[, -which(colnames(dat_dump) == "e_id")] %>%
                mutate( date = as.Date(date, format = "%Y-%m-%d")) %>%
                `row.names<-`(., NULL) %>%
                column_to_rownames(var = "date")

            dat_dump_log <- as.data.frame(sapply(dat_dump, function(x) diff(log(as.numeric(x)))))

            row_names_df <- tail(rownames(dat_dump), -1)

            row.names(dat_dump_log) <- row_names_df

            df_log <<- dat_dump_log

            total_num_of_codes <<- ncol(dat_dump_log)
            total_num_of_obs_df <<- nrow(dat_dump_log)






        }) %...>%

        beep()
    })   

    output$observation_months <- renderUI({

        data() %...>% {
            num <- total_num_of_obs_df
            if (is.null(num)) {

                return(NULL)

            } else if( !is.null(num)){

                textInput( inputId = "observation_months_input",
                           label = "Observation Months (in mo.)",
                           value = 12
                )



            }
        }
    })


    output$summary <- renderPrint({
        summary(data()[1000])
    })



}

目前,我可以根据server (output$observation_months) 中的条件渲染一个textInput。目前我无法渲染多个组件(添加output$h_months 和另一个%...&gt;% 将不起作用。这是因为R 使用命名空间的方式。我读到我可以使用modules(即https://shiny.rstudio.com/articles/modules.html ) 以便能够同时呈现多个用户界面。

我有一种感觉,我想要完成的工作实际上并不需要在应用程序之外使用单独的 server 逻辑,并且可以在不使用模块的情况下完成。

有什么想法吗?谢谢。

【问题讨论】:

    标签: r asynchronous shiny future


    【解决方案1】:

    我使用tagList 函数对输入进行分组并将其渲染到renderUI

    load_spec_selection1

        ns <- NS(id)
    
        tagList(
    
            textInput( inputId = ns("o_months"),
                       label = "Months (in mo.)",
                       value = 12
            ),
    
            textInput( inputId = ns("h_months"),
                       label = "Months (in mo.)",
                       value = 6
            )
    
        )
    
    }
    
    output$specs_inputs <- renderUI({
    
            data() %...>% {
                num <- total_num_of_obs_df
                if (is.null(num)) {
    
                    return(NULL)
    
                } else if( !is.null(num)){
    
                    load_spec_selection1("specs_input")
    
                }
            }
        })
    

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2014-11-28
      • 2021-08-06
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多