【发布时间】:2019-12-14 02:02:09
【问题描述】:
我使用 lapply 在闪亮中创建了一个动态文件输入。当我想读取文件时,我还在观察者中使用了 lapply 。
这里使用 lapply 的问题是,每次上传新文件时都会触发它,因此,如果上传了新文件,则会一次又一次地读取所有文件。
在这里,我提供了一个 Hello World 应用程序。 lapply 函数依赖于一个输入参数,为简单起见,我从中提取了该参数。
library(shiny)
ui <- fluidPage(
titlePanel("Hello World"),
sidebarLayout(
sidebarPanel(),
mainPanel(
lapply(1:2, function(i) {
fileInput(
paste0("file", i),
label = NULL,
multiple = F,
accept = c(
"text/csv",
"text/comma-separated-values,text/plain",
".csv"
),
buttonLabel = paste("File", i)
)
}),
verbatimTextOutput("list")
)
)
)
server <- function(input, output) {
r <- reactiveValues()
observe({
lapply(1:2, function(i) {
file <- input[[paste0("file",i)]]
if(is.null(file)) return()
isolate({
r$file[[paste(i)]] <- readr::read_csv2(file = file$datapath)
})
})
})
output$list <- renderPrint(reactiveValuesToList(r))
}
shinyApp(ui = ui, server = server)
如何替换循环或添加要求到 lapply?
【问题讨论】:
-
代码示例可能有点太小了:
observe只是读取数据(并立即丢弃它)并没有显示您正在尝试做什么。但是一个想法:是否有可能以相同的名称但不同的数据重新上传文件?如果是,那么您有 cache-invalidation 的问题:您可以选择不重新读取您之前看到的文件,但如果上传了一个新的(不同的数据)同名文件,你永远看不到它。 -
如果你确定同名总是相同的(或愿意接受结果),那么我建议你创建一个
rv <- reactiveValues(),名称为文件名;在您的observe中,检查是否已读取文件名(每个文件的file$datapath %in% names(rv)),如果没有存储表(rv[[ file$datapath ]] <- readr::read_csv2(...))。 -
-
感谢您的快速回复!我的应用程序中没有直接丢弃数据。我将 reactiveValues 添加到文件部分和输出以指示处理和保存方案。
标签: r file-io shiny lapply observers