【发布时间】:2017-08-09 09:53:44
【问题描述】:
背景
假设我有一个shiny 应用程序,用户可以在其中上传 Excel 文件。用户将有权访问某个 Excel 模板,我想确保只上传此模板的副本。
我目前的做法
我现在的做法如下:
- 检查工作表名称 xyz 是否存在 -> 如果不存在则抛出错误
- 从工作表 xyz 中读取数据,将列名与要求进行比较 -> 如果缺少列会引发错误
- 重复所有必要的工作表
当前方法存在问题
这需要对所需的工作表名称和所需的列名称进行大量硬编码,并且变得乏味。
问题
所以我的问题是:如何确保用户提供有效文件?您通常使用什么策略来确保您的应用可以正确处理上传的文件?
伪代码
library(shiny)
library(tidyverse)
ui <- fluidPage(fileInput("file", "Upload Excel"))
server <- function(input, output, session) {
observe({
req(input$file)
sheet1 <- tryCatch(read_xlsx(input$file$datapath, sheet = "xyz"),
error = function(e) {
## do some sort of error handling, e.g. write to a reactiveValue list
})
if (!all(.REQUIRED_FIELDS_FOR_XYZ %in% names(sheet1))) {
## signal error
}
})
}
【问题讨论】:
-
您不能直接使用您的模板作为测试吗?像
identical(names(template), names(upload_xlsx)),和床单等一样? -
是的,这确实很有帮助。但我必须承认,我有点迷失了使用哪个库。例如,
readxl::read_xlsx的原因是我必须提供工作表名称。在您的提案中:str(template)会打印出什么? -
我使用
xlsx包。在这里,我可以通过提供索引来读取 excel 文件。xlsx::read.xlsx('test.xlsx', 1)这会返回一个data.frame,所以str会打印维度和列名以及数据结构。 -
其实,你让我走上了正轨。我想我会上传模板文件并从那里导出工作表名称列名等作为模型。如果您费心制定答案,我会很乐意接受,因为您让我走上了正轨。 +1