【发布时间】:2019-08-13 09:11:06
【问题描述】:
我正在尝试使用期货来显示“加载”图标。这是我的代码
library(shiny)
library(promises)
library(future)
plan(multiprocess)
disksUI <- function(id) {
ns <- NS(id)
fluidRow(
box(
uiOutput(ns("loading")),
dataTableOutput(ns("filelist")),
width=12
)
)
}
disksServer <- function(input, output, session) {
state <- reactiveValues(onLoading=FALSE)
observe({
if (state$onLoading) {
output$loading <- renderUI("Loading")
} else {
output$loading <- renderUI("Done")
}
})
filelist <- reactive(
{
state$onLoading <- TRUE
future({
Sys.sleep(3)
state$onLoading <- FALSE
}
)
}
)
output$filelist <- renderDataTable({
filelist()
})
}
但是,结果不是我所期望的。我期待的是
- 字符串Loading 立即出现
- 三秒后,字符串 Loading 被替换为 Done
会发生什么
- 三秒钟内什么都没有写。
- 三秒后,加载字符串出现。
【问题讨论】:
-
我建议探索一下 shinycssloaders 包 - 在加载内容时提供微调器,而不是被其他需要加载的内容所阻碍。
-
@Megan 那个包使用了一个技巧。微调器总是在那里,它只是在一个使其不可见的 z-index 处,并希望它出现,因为重新绘制会使顶层消失,这不是我的情况。此外,它没有使用任何期货。这不是解决旋转器问题。它是关于理解如何处理上述用例(在异步请求后添加新的 UI 元素),它在 React 中有效。