Shiny App - 从上传的 CSV 生成和下载 PPTX 幻灯片

Posted

技术标签:

【中文标题】Shiny App - 从上传的 CSV 生成和下载 PPTX 幻灯片【英文标题】:Shiny App - Generate & download PPTX slides from uploaded CSV 【发布时间】:2018-12-23 02:36:59 【问题描述】:

我有一个 R 脚本,它通过编译来自 csv 文件的数据在 powerpoint 幻灯片上生成各种图表。我正在尝试将其转换为一个闪亮的应用程序,该应用程序在上传 csv 文件后生成卡片组,但无法弄清楚如何读取 csv 文件然后生成 pptx 下载。

这是我的用户界面:

ui <- (fluidPage(
  titlePanel("Title"),
  title = "File Upload",

  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "File1:",
                accept = c("text/csv", "text/comma-separated-values, 
text/plain", ".csv")),
    ),
mainPanel(
  downloadButton('downloadData', 'Download')
    )

  )
)
  )

还有我的服务器功能:

server<- function(input, output,session) 

 output$downloadData <- downloadHandler(
data_file <- reactive(
  inFile <- input$file1
  if (is.null(inFile)) return(NULL)
  read.csv(inFile$datapath, na.strings = "null")
),


filename = "file.pptx",

content = function(file)

当引用本地文件时,代码会生成一个卡片组。当我上传文件时,我收到以下错误。我还将数据文件部分移到了下载处理程序之外,但没有任何反应。

警告:downloadHandler 中的错误:未使用的参数(数据文件

有什么建议吗?

【问题讨论】:

【参考方案1】:

我通常通过使用reactiveValuesobserveEvent 而不是reactive 来避免这种情况。

server <- function(input, output)
r_values <- reactiveValues(data=NULL) # reactive values just acts as a list

    observeEvent(input$file1,
        req(input$file1)
        df <- read.csv(input$file1$datapath)
    )

然后您可以使用r_values$data 提取您的数据。

【讨论】:

【参考方案2】:

您遇到的问题是 downloadHandler 与所有函数一样,只接受其帮助文件中描述的特定参数:?downloadHandler

downloadHandler(filename, content, contentType = NA, outputArgs = list())

通过在函数调用中粘贴一段 R 代码(data_file &lt;- reactive(...),R 将该代码视为一个参数,并试图弄清楚如何将其传递给函数。因为它是第一个参数,它通常会尝试将它传递给第一个参数,在这种情况下 filename (这会给出一个错误,因为 filename 接受一个字符串,而不是一个 R 表达式),但你已经稍后在调用中使用命名参数定义 filename,因此 R 不知道如何处理此参数并返回 unused argument 错误。

您应该将这段代码移出downloadHandler 函数(但在server 函数内部),然后从传递给content 参数。

【讨论】:

以上是关于Shiny App - 从上传的 CSV 生成和下载 PPTX 幻灯片的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny - 使用 csv 中的数据和用户 numericInput 进行计算

从 R Shiny App 输出纯 HTML 文件

在R Shiny中如何分离滑块输入值并使用它们进行过滤

如何从 Shiny 中的下拉框中根据变量选择动态创建直方图

闪亮:如何默认上传带有标题=T和分隔符=“,”的.csv?

如何在 Shiny 中使用 textInput 来命名上传数据框的列