【发布时间】:2022-01-02 20:01:37
【问题描述】:
在运行下面的“缩写代码”时,我正在尝试创建一个文件上传验证,即要上传的 csv 在 csv 的单元格 A1 和 B1 中必须具有“场景 1”和“场景 1”。否则文件不会上传,并被标记为“无效”。关于如何做到这一点的任何想法?
如果您运行以下命令,请单击单个操作按钮并通过单击模式对话框底部的按钮来保存矩阵输入,查看下载的 csv,并查看单元格 A1 和 B1 如何显示“场景 1”和下载矩阵中的“场景 1”。这很好。如果您删除这些并保存 csv,您会看到在运行应用程序时仍然可以上传修改后的 csv。我希望这 2 个 csv 字段用作验证标志。
我真的很喜欢 try() 函数作为这个应用程序中的包罗万象的测试。
缩写代码:
library(dplyr)
library(shiny)
library(shinyFeedback)
library(shinyMatrix)
sumMat <- function(x){return(rep(sum(x,na.rm = TRUE), 10))}
ui <- fluidPage(
useShinyFeedback(),
sidebarLayout(
sidebarPanel(
actionButton("matrix3show","Click for matrix input"),
),
mainPanel(plotOutput("plot"))
)
)
server <- function(input, output, session) {
uploadMat3Data <- reactive({
req(input$uploadMat3)
validate(need(identical(tools::file_ext(input$uploadMat3$datapath),"csv"),"Invalid"))
try(read.csv(input$uploadMat3$datapath, header = TRUE))
})
observeEvent(uploadMat3Data(), {
if(is.data.frame(uploadMat3Data())){
updateMatrixInput(session,"matrix3",as.matrix(uploadMat3Data()))
hideFeedback("file")
}
else {showFeedbackWarning("file", "Invalid")}
})
observeEvent(input$matrix3show,{
showModal(
modalDialog(
fileInput(inputId = "uploadMat3",label = NULL,accept = ".csv"),
matrixInput(
inputId = "matrix3",
value = if(is.null(input$matrix3)){matrix(c(1,5),ncol=2,dimnames=list(NULL,rep("Scenario 1",2)))}
else {input$matrix3},
rows = list(extend = TRUE, delete = TRUE),
cols = list(extend = TRUE, delta = 2, delete = TRUE, multiheader = TRUE),
class = "numeric"),
output$verbMat3 <- renderPrint(class(uploadMat3Data())),
footer =
tagList(
downloadButton("saveMat3","Save",style = "width:80px;"),
modalButton("Exit box")
) # close tag list
))
})
observeEvent(input$matrix3, {
tmpMat3 <- input$matrix3
colnames(tmpMat3) <- paste("Scenario",rep(1:ncol(tmpMat3),each=2,length.out=ncol(tmpMat3)))
rownames(tmpMat3) <- paste("Row", seq_len(nrow(input$matrix3)))
updateMatrixInput(session,inputId="matrix3",value=tmpMat3)
})
data <- function(){tibble(X = seq_len(10),Y = sumMat(input$matrix3))}
output$plot<-renderPlot({plot(data(),type="l")})
output$saveMat3 <- downloadHandler(
filename = function(){paste("Inputs","csv",sep=".")},
content = function(file){write.csv(input$matrix3, file,row.names=FALSE)}
)
}
shinyApp(ui, server)
【问题讨论】:
标签: r validation shiny upload