【问题标题】:How to validate csv file for upload via fileInput function in shiny App?如何验证通过闪亮应用中的fileInput函数上传的csv文件?
【发布时间】: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


    【解决方案1】:

    为了解决这个问题,我将uploadMat3Data()observeEvent 更改为以下内容:

    observeEvent(uploadMat3Data(), {
        if(is.data.frame(uploadMat3Data()) 
           && colnames(uploadMat3Data()[1]) == "Scenario.1"
           && colnames(uploadMat3Data()[2]) == "Scenario.1.1"
           ){
              updateMatrixInput(session,"matrix3",as.matrix(uploadMat3Data()))
              hideFeedback("uploadMat3")
              } 
        else {showFeedbackWarning("uploadMat3", "Invalid")}
      })
    

    注意&amp;&amp; colnames(... 的添加,其中代码窥视已上传数据帧的标头并检查所需的标头。另请注意,在原始代码中,hideFeedback()showFeedbackWarning() 中的 id 引用不正确;它们现在更正为“uploadMat3”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-16
      • 2018-09-24
      • 1970-01-01
      • 2023-03-09
      • 2013-06-25
      • 2015-10-14
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多