当应该加载csv文件时加载excel文件时闪亮抛出错误

时间:2017-11-07 16:58:29

标签: r shiny

我设计了一个使用闪亮的工具,要求用户上传通过radiobutton设计的csv或xlsx文件。现在有四个条件

  1. 他选择了csv并上传了一个正确的csv文件
  2. 选择xlsx并上传xlsx文件,也正确
  3. 选择csv并上传xlsx文件,这是不正确的
  4. 选择xlsx并上传csv文件也不正确
  5. 现在对于第3点和第4点,我检查是否存在任何不匹配,如果是,则警告用户重新加载正确的文件类型。但是,没有检测到第4点,并且工具通过自己的错误。

    ui code

    library(shiny)
    library(xlsx)
    library(tools)
    shinyUI(fluidPage(
    titlePanel("fileinput"),
    sidebarLayout(
    sidebarPanel(
      radioButtons("filetype", "Select file type",choices=c("csv file","xlsx file")),
      fileInput("file1","upload",accept = c("text/csv","text/comma-separated-values,text/plain",".csv",".xlsx",".xls"))
    
      ),
      mainPanel(
      uiOutput("Image_Data")
      )
      )
      )
      )
    

    服务器代码

    shinyServer(function(input, output) {
    # loading data
    data <- reactive({
    if(input$filetype=="xlsx file"){
      inFile <- input$file1
      if (is.null(inFile))
        return(NULL)
      a<-read.xlsx(inFile$datapath, sheetIndex=1,header =TRUE)
      as.data.frame(a)
      }else{
      inFile <- input$file1
      if (is.null(inFile))
        return(NULL)
      a<-read.csv(inFile$datapath,header =TRUE,stringsAsFactors = TRUE)
      as.data.frame(a)
      }})
    # info of the file
    output$about_file<-renderTable({
    input$file1})
    # to display data
    output$display <- renderDataTable({
    data()})
    # passing to UI finally
    output$Image_Data<-renderUI({
    if(is.null(data())){
    h1("forecasting tool")
    }
    else if(input$filetype=="csv file" & input$file1$type != "text/csv"){
    sprintf("reload correct file type")}
    else if(input$filetype=="xlsx file" & input$file1$type != 
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"){
      sprintf("reload correct file type")}
      else if(input$filetype=="xlsx file" & input$file1$type != 
                                                 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"){
    sprintf("reload correct file type")
    }else{
    tabsetPanel(tabPanel("DATA",dataTableOutput("display")), 
               tabPanel("aboufile", tableOutput("about_file")))
      }})})
    

    我安装了java 64位,这是在r。

    中使用excel文件所必需的

2 个答案:

答案 0 :(得分:0)

您的问题是您在检查datatyp之前正在读取文件。在阅读文件之前,请尝试检查文件的结尾。

例如,您可以检查文件是否是具有类似此内容的excel文件

regexpr("\\.xlsx",input$file1) != -1

答案 1 :(得分:0)

对不起,我的RnD基本缺乏。

问题不是闪亮而是read.xlsx。

read.xlsx不会加载除xlsx之外的任何其他文件类型,因此抛出错误而read.csv不会抛出任何错误(它会发出警告)并加载其他类型(xlsx),尽管加载的文件在加载后变得无关紧要。

我所做的只是使用了tryCatch函数并相应地修改了else。 以下是server.r的更正代码

shinyServer(function(input, output) {
# loading data
data <- reactive({
if(input$filetype=="xlsx file"){
  inFile <- input$file1
  if (is.null(inFile))
    return(NULL)
  a<-tryCatch(read.xlsx(inFile$datapath, sheetIndex=1,header =TRUE),error = function(e) return("wrong"))
  as.data.frame(a)
}else{
  inFile <- input$file1
  if (is.null(inFile))
    return(NULL)
  a<-read.csv(inFile$datapath,header =TRUE,stringsAsFactors = TRUE)
  as.data.frame(a)
}})
# info of the file
 output$about_file<-renderTable({
          input$file1})
 # to display data
 output$display <- renderDataTable({
 data()})
# passing to UI finally
output$Image_Data<-renderUI({
if(is.null(data())){
  h1("forecasting tool")
}else if(input$filetype =="csv file" & input$file1$type != "text/csv"){

  h4(br(),br(),"Mismatch in formats of file selected and uploaded!!",style = "color: red;")


}else if(length(data())==1){
  #h4(br(),br(),"Mismatch in formats of file selected and uploaded!",style = "font-style: italic;font-weight: bold;color: red;text-align: center;")
  h4(br(),br(),"Mismatch in formats of file selected and uploaded!",style = "color:red")
  #sprintf("testing")
}else{
  tabsetPanel(tabPanel("DATA",dataTableOutput("display")), 
              tabPanel("aboufile", tableOutput("about_file")))
}})})