r - R Shiny:renderUI + uiOutput多个输入条件异步
问题描述
我正在创建一个应用程序。
目前我有一个用户界面,用户可以在其中按下按钮从数据库执行查询以获取数据。
抓取数据后(需要很长时间)。我在抓取数据的末尾使用future
and函数创建了一个异步,以自动加载更多的 ui 使用(我计划根据抓取的数据使其成为动态的)%...>%
renderUI
到目前为止看起来像这样:
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])
})
}
目前,我可以根据( )textInput
中的条件渲染一个。目前我无法渲染多个组件(添加另一个组件不起作用。这是因为 R 使用命名空间的方式。我读到我可以使用(即https://shiny.rstudio.com/articles/ modules.html ) 以便能够同时呈现多个用户界面。server
output$observation_months
output$h_months
%...>%
modules
我有一种感觉,我想要完成的事情并不真正需要server
应用程序之外的单独逻辑,并且可以在不使用模块的情况下完成。
有什么想法吗?谢谢。
解决方案
我使用该tagList
函数对输入进行分组并将其渲染到renderUI
load_spec_selection1 <- function(id, label = "spec_selection_inputs") {
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")
}
}
})
推荐阅读
- html - 如何使按钮在 HTML 中重定向您?
- python - Python 从动态 XML 数组中解析特定属性并组合数据
- reactjs - 如何使用数据库内容填充 reactjs 表单?
- python - 如何在 Python 中重定向 os.system() 输出?
- typescript - Rxjs:fromPromise 和 toPromise 操作是否昂贵?
- permissions - 池 - 多处理 - [Errno 13] 权限被拒绝
- android - 疯狂的 Android Studio 内存使用
- snowflake-cloud-data-platform - 可以通过从另一列复制数据类型来创建表列吗?(例如 Oracle 中的 %type)
- python - Python dict.get 返回 0 评估为 false
- python - 从 scipy.interpolate 导入 RegularGridInterpolator 时出错