我有一个应用,用户从下拉菜单(selectizeInput
)中选择文件名,并使用actionButton
确认选择。该应用程序将以DT::dataTableOutput
格式显示结果。
我希望能够显示加载屏幕(使用shinydashboardloader
包),但仅在用户按下actionButton
后显示。在此之前,我想显示一个空屏幕。此外,如果用户想要在一个会话中尝试多个文件,则每次按下actionButton
时都会显示加载屏幕,并在加载数据集时消失。
目前,如果我运行此应用程序,加载按钮会一直出现,也是在用户选择文件之前
### ui.R
library(shiny)
library(shinydashboard)
library(DT)
library(shinycustomloader)
dashboardPage(
dashboardHeader(),
dashboardSidebar(
selectizeInput("file", "Select File",
c("fileA", "fileB")),
actionButton("submit", "Submit")
),
dashboardBody(
fluidRow(
box(h2("My Data"),
div(style = 'overflow-x: scroll',
withLoader(DT::dataTableOutput('mytable'),
type = "html",
loader = "loader1")),
width = 12)
)
)
)
#### server.R
library(shiny)
library(shinydashboard)
library(DT)
shinyServer(function(input, output, session) {
file_name <- reactive({
req(input$file)
})
# When the Submit button is clicked, start the cleaning and matching
observeEvent(input$submit, {
## open chosen file
# open_file <- read_excel(paste0("input_files/", file_name()))
### + some processing that gives me matched_df
matched_df <- data.frame(A = c(1, 2, 3, 4),
B = c("A", "B", "C", "D"))
selected <- reactive({
matched_df # + apply some filter
})
output$mytable = DT::renderDataTable({
selected()
})
})
})
我猜测前进的方法是使用conditionalPanel
,但我不确定如何点击actionButton
条件。
我将conditionalPanel
应用于数据表,但仅在我第一次按“提交”按钮时才有效。如果在同一会话中我更改文件名并再次按下按钮,则不会显示加载程序。任何想法如何让我在一个会话中多次工作?
dashboardBody(
fluidRow(
box(h2("My Data"),
conditionalPanel("input.submit==1",
div(style = 'overflow-x: scroll',
withLoader(DT::dataTableOutput('mytable'),
type = "html",
loader = "loader1"))
),
width = 12)
任何帮助都会很棒,谢谢!
答案 0 :(得分:1)
1:我不熟悉TextBlock
,但我可以使用shinydashboardloader
包来隐藏和显示使用CSS的元素,从而为我的应用添加加载指示器。我会将您的加载页面元素添加到主页面并将它们包装在shinyjs
函数中,以便它们默认隐藏。然后,当用户点击操作按钮时,请致电shinyjs::hidden
以显示他们,并shinyjs::showElement
在加载完成后隐藏它们。
用户界面:
shinyjs::hideElement
SERVER:
shinyjs::hidden(div(id = 'loading',
# PUT LOADING ELEMENTS HERE))
2:至于您的编辑问题,您的条件面板仅首次显示的原因是每次点击observeEvent(input$submit, {
# Show element once submit button is pressed
shinyjs::showElement(id = 'loading')
# CODE TO MAKE DATA FRAME
# Hide loading element when done
shinyjs::hideElement(id = 'loading')
)
的值增加1。所以第一次点击它就会从0变为1;如果你再次点击它,它会从1到2,依此类推。由于您将条件设置为actionButton
,因此仅在按钮被单击一次时才会显示。
要让它按照您的意愿执行操作,您需要将条件更改为input$select == 1
,以便只要单击按钮一次就会显示该条件,或添加设置为input$select > 1
的条件单击按钮时为1,然后在满足另一个条件时重置为0(如加载完成时)。
reactiveValue