我有一个shinyapp,必须在显示一组图和数据之前计算一个漫长的过程。我将其放在一个反应性对象中以执行操作,然后在不重新计算的情况下切换。
。当反应性对象正常工作时,如何在每个选项卡中添加"计算中的计算"框?
我已经尝试过,但是它不起作用,或者至少我不知道将标签放在哪里:
https://gist.github.com/withr/8799489
欢迎任何帮助,这是一个例子:
library("shiny")
library("shinydashboard")
shinyApp(
ui=shinyUI(dashboardPage(skin = "blue",
dashboardHeader(title = "Dashboard"),
dashboardSidebar(
sliderInput("obs", "Number of observations:",
min = 10000, max = 90000, value = 50000, step = 10000)
),
dashboardBody(
tabBox(
tabPanel("Tab 1", "This is tab number 1", tableOutput("tabData")),
tabPanel("Tab 2", "This is tab number 2", plotOutput("tabPlot"))
)
)
))
,
server=shinyServer(function(input, output) {
calculate_hist <- reactive({
cat("Calculating for ",input$obs,"n")
if (is.null(input$obs)) {
dist <- NULL
}else{
dist<-numeric()
for (i in 1:input$obs) dist <- c(dist, rnorm(1))
}
cat("Endedn")
dist
})
output$tabPlot<-renderPlot({
chist<-calculate_hist()
if (is.null(chist)){
return()
}else{
hist(chist, breaks = 100)
}
})
output$tabData<-renderTable({
chist<-calculate_hist()
if (is.null(chist)){
return()
}else{
sumdata<-data.frame(n=length(chist),mean=mean(chist),var=var(chist))
sumdata
}
})
})
)
您可以使用shinysky
软件包中使用busyIndicator
函数,并使用shinyjs
软件包使用inlineCSS
覆盖其CSS。
类似的东西:
library(shiny)
library(shinydashboard)
library(shinysky)
library(shinyjs)
shinyApp(
ui=shinyUI(dashboardPage(skin = "blue",
dashboardHeader(title = "Dashboard"),
dashboardSidebar(
sliderInput("obs", "Number of observations:",
min = 10000, max = 90000, value = 50000, step = 10000)
),
dashboardBody(
useShinyjs(),
tags$body(inlineCSS(list(".shinysky-busy-indicator" = "position: absolute !important; z-index:800; "))),
tabBox(
tabPanel("Tab 1",
busyIndicator(wait = 1000),
"This is tab number 1",
tableOutput("tabData")),
tabPanel("Tab 2",
busyIndicator(wait = 1000),
"This is tab number 2",
plotOutput("tabPlot"))
)
)
))
,
server=shinyServer(function(input, output) {
calculate_hist <- reactive({
cat("Calculating for ",input$obs,"n")
if (is.null(input$obs)) {
dist <- NULL
}else{
dist<-numeric()
for (i in 1:input$obs) dist <- c(dist, rnorm(1))
}
cat("Endedn")
dist
})
output$tabPlot<-renderPlot({
chist<-calculate_hist()
if (is.null(chist)){
return()
}else{
hist(chist, breaks = 100)
}
})
output$tabData<-renderTable({
chist<-calculate_hist()
if (is.null(chist)){
return()
}else{
sumdata<-data.frame(n=length(chist),mean=mean(chist),var=var(chist))
sumdata
}
})
})
)
希望它有帮助!