【发布时间】: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 和另一个%...>% 将不起作用。这是因为R 使用命名空间的方式。我读到我可以使用modules(即https://shiny.rstudio.com/articles/modules.html ) 以便能够同时呈现多个用户界面。
我有一种感觉,我想要完成的工作实际上并不需要在应用程序之外使用单独的 server 逻辑,并且可以在不使用模块的情况下完成。
有什么想法吗?谢谢。
【问题讨论】:
标签: r asynchronous shiny future