【问题标题】:Writing and Saving to excel file with Shiny使用 Shiny 写入和保存到 excel 文件
【发布时间】:2019-04-30 12:50:16
【问题描述】:

我的应用程序允许用户输入日期范围、部门、pdf 文件和 excel 文件。该程序从 pdf 中提取数字,计算总分,并将其添加到从现有 excel 文件中提取的排名中。它应该写入并保存excel文件。没有 Shiny,我的程序运行良好。在 Shiny 中,它正在运行并且数据是正确的,但它不会将数据添加到 excel 文件中。我在各个阶段添加了打印提示来测试这一点。我也尝试过在外部运行它,结果相同。它不会抛出错误,只是不会将数据添加到 excel 文件中。

服务器功能

server<-function(input,output){

  output$horse_div <- renderText({ 
    paste("You have chosen",input$division)
    })

  output$qualifying<-renderText({
    paste("Qualifying Period from",input$date[1],"to",input$date[2])
  })

  output$pdf<-renderText({
    req(input$horsereport)
    req(input$excelfile)
    ponyoutput<-horseRecord(input$horsereport$datapath,input$date[1],input$date[2],input$division,input$excelfile$datapath)
    paste("mylist",ponyoutput[1])
  })
}

horseRecord 函数片段

#Set up sheet and excel file
  wsheetrank<-paste(div,"RANK")
  wsheetpoints<-paste(div,"POINTS")

  #load workbook
  wb<-loadWorkbook(file=excelfile)

  #add pony to ranked list
  rank<-read.xlsx(excelfile,wsheetrank)
  rank<-rank[,2:3]
  rank<-rank %>% mutate(Points=as.numeric(Points))
  dat<-rank
  dat<-dat%>% add_row(Pony=horse,Points=points) %>% arrange(desc(Points))

  #remove duplicates
  dat<-dat[!duplicated(dat$Pony),]
  rownames(dat)<-seq(from=1,to=nrow(dat),by=1)

  #find rank
  rank<-grep(horse,dat$Pony)

  #Write to excel file
  writeData(wb,sheet=wsheetrank,x=dat,colNames=TRUE,rowNames = TRUE,borders="all")
  saveWorkbook(wb,excelfile,overwrite=TRUE)

这应该将从 PDF 文件中提取的总分添加到排名列表中,然后再写入排名工作表。完整的代码和文件可以在这里找到:https://github.com/chealy21/horsePoints

【问题讨论】:

  • 第一个问题很好!下一次,请发布一个最小且可重现的示例。在这种情况下,您可以通过 10 行代码下的自包含示例来说明您的问题。它不一定是真实数据:)

标签: r excel shiny


【解决方案1】:

您上传的 excel 文件将保存在闪亮服务器上的临时文件中。即使您在本地运行应用程序,它也不是磁盘上的 excel 文件。

如果您在将数据写入工作簿之前添加browser()horsereportfunction.R 的第 138 行),当应用程序到达该行时,您将收到控制台提示,您将能够自己看到它。

这是 excelfile 变量中的内容(在 linux 机器上。Windows 临时文件在其他地方,但它们仍然只是 tmp 文件):

excelfile
# [1] "/tmp/RtmpFllCQq/5709c4b043babf5b85bd29b4/0.xlsx"

闪亮服务器上的这个临时文件确实得到了更新:

readxl::read_excel("/tmp/RtmpFllCQq/5709c4b043babf5b85bd29b4/0.xlsx") %>% filter(Pony == "BIT OF LAUGHTER")
# # A tibble: 1 x 3
#   ..1   Pony            Points
#   <chr> <chr>            <dbl>
# 1 30    BIT OF LAUGHTER  1503.

这符合documentation for fileInput

每当文件上传完成时,相应的输入变量都会设置为数据框。该数据框包含每个选定文件的一行,以及以下列:

  • 名称: Web 浏览器提供的文件名。这不是获取上传的实际数据的读取路径(请参阅数据路径列)。
  • 尺寸: 上传数据的大小,以字节为单位。
  • 类型: 浏览器报告的 MIME 类型(例如 text/plain),如果浏览器不知道,则为空字符串。
  • 数据路径: 包含已上传数据的临时文件的路径。如果用户执行其他上传操作,此文件可能会被删除。

也许你可以让用户在更新后下载更新的报告(来自datapath)?

如果您从不打算发布您的应用程序并且总是在本地使用它,您可以对 excel 文件目录进行硬编码。然后,您的应用将从datapath 的硬编码位置复制工作簿。

【讨论】:

  • 谢谢!我认为那是我缺少的部分。然而,还有一个我无法回答的问题。由于我没有从此函数返回 excel 文件,我将如何访问数据路径以允许用户下载它?我想避免硬编码文件目录。
  • 我可以通过 input$excelfile$datapath 访问它;但是,我必须添加下载处理程序 content = function(file){file.rename(input$excelfile$datapath,file} 才能使其正常工作。
  • 你已经访问了它(因为临时文件确实被 horserecord 函数更新了):它在input$excelfile$datapath。您可以添加downloadHandler 以允许用户下载。
  • @CarrieHealy 我正要建议content = function(file) file.copy(from = input$excelfile$datapath, to = file),但你的建议也有效!
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多