【发布时间】:2019-12-29 23:20:04
【问题描述】:
我在文件 CheckClawback.R 中定义了一个函数 (clawCheck),它接受三个数据帧作为参数。在我的 Shiny 应用程序中,用户上传三个文件,然后将这些文件读入内存并用作 ClawCheck 参数。为了节省时间,我希望 R 在文件上传后立即开始将文件读入内存,而不仅仅是在按下“GO”按钮之后,这样一旦按下按钮,ClawCheck 的参数就已经在内存并准备好使用。
我认为我必须在 renderTable 语句中使用 eventReactive 表达式,因为我不希望每次用户更改某些输入时都重新读取文件。为了避免进一步的复杂化,我假设输入是按顺序填写的,即首先是“account”,然后是“commpaid”,然后是“termriders”。当我运行应用程序并上传第一个输入文件时,没有出现进度条,这表明我的代码工作不正常。这是我的(简化的)代码:
library('shiny')
source("CheckClawback.R")
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fileInput("account", "Account File (.csv)"),
fileInput("commpaid", "CommPaid File (.txt)"),
fileInput("termriders", "TermRiders File (.txt)"),
actionButton("do", "GO!")),
mainPanel(
tableOutput("out_table"))
)
)
server <- function(input, output) {
func <- eventReactive(input$do, {
req(acc)
req(comm)
req(term)
datat <<- clawCheck(acc, comm, term)
})
output$out_table <- renderTable({
eventReactive(input$account, {
withProgress(message = "Preparing Account Data...Please Wait", {
acc <<- read.csv(input$account$datapath, header = TRUE, sep = ",")
})
})
eventReactive(input$commpaid, {
withProgress(message = "Preparing CommPaid Data...Please Wait", {
comm <<- read.table(input$commpaid$datapath, header = TRUE, sep = "\t")
})
})
eventReactive(input$termriders, {
withProgress(message = "Preparing TermRiders Data...Please Wait", {
term <<- read.table(input$termriders$datapath, header = TRUE, sep = "\t")
})
})
withProgress(func(), message = "Loading Output...Please Wait")
datat
})
}
shinyApp(ui = ui, server = server)
理想情况下,文件上传后,应该会出现一个进度条,表明它正在处理中。如果在此过程中上传了第二个文件,则应出现第二个进度条,指示正在处理第二个文件等。一旦发生实际函数调用,我希望输入文件准备就绪。
非常感谢您的帮助!
【问题讨论】:
标签: r shiny reactive shiny-reactivity