" read_excel"在一个闪亮的应用程序

时间:2015-06-03 15:18:01

标签: r shiny xlsx

我有一个Shiny应用程序,它使用程序包read.xlsx中的xlsx函数。一切正常,但我想从read_excel更改为readxl,希望它更快,能够处理大文件。

ui part:

fileInput("inputFile","Upload file...")

服务器部分:

  data <- reactive({
    inFile <- input$inputFile
    if (is.null(inFile)) { return(NULL) }    
    dataFile <- read_excel(inFile$datapath,sheet=1)
    return(dataFile)
  })

我得到了#34;未知格式&#34;错误。

  

inFile $ datapath是&#34; / tmp /.../ 60974676c7287e913d1c0dc5 / 0&#34;
  inFile $ type是&#34; application / vnd.openxmlformats-officedocument.spreadsheetml.sheet&#34;

问题1:有没有办法告诉read_excel它是xlsx类型的文件?
问题2:是否可以控制上传文件的存储位置?

2 个答案:

答案 0 :(得分:18)

这是一个带有readxl包的open issue。提供的当前解决方法是复制文件数据路径并附加.xlsx。以下是我的计算机上的一个工作示例,仅限.xlsx个已编辑过的文件,而不是file.rename

file.copy

修改 请注意,对于library(shiny) library(readxl) runApp( list( ui = fluidPage( titlePanel("Use readxl"), sidebarLayout( sidebarPanel( fileInput('file1', 'Choose xlsx file', accept = c(".xlsx") ) ), mainPanel( tableOutput('contents')) ) ), server = function(input, output){ output$contents <- renderTable({ inFile <- input$file1 if(is.null(inFile)) return(NULL) file.rename(inFile$datapath, paste(inFile$datapath, ".xlsx", sep="")) read_excel(paste(inFile$datapath, ".xlsx", sep=""), 1) }) } ) ) 版本的1.1.0,不再需要重命名该文件。以下对我来说没有问题。

readxl

答案 1 :(得分:0)

确保用户确实上传.xlsx文件,或者您需要检查您自己的扩展名以在读取功能之间切换。您可以按如下方式提取扩展名:

library(shiny)
library(readxl)

runApp(
list(
    ui = fluidPage(
        titlePanel("Use readxl"),
        sidebarLayout(
            sidebarPanel(
                fileInput('file1', 'Choose xlsx file',
                          accept = c(".xlsx")
                          )
                ),
            mainPanel(
                tableOutput('contents'))
            )
        ),
    server = function(input, output){
        output$contents <- renderTable({
            inFile <- input$file1

            if(is.null(inFile))
                return(NULL)

            ext <- tools::file_ext(inFile$name)
            file.rename(inFile$datapath,
               paste(inFile$datapath, ext, sep="."))
            read_excel(paste(inFile$datapath, ext, sep="."), 1)
         })
        }
    )
)