How to Save User Input as a Downloadable Word Document in Shiny Apps Using R

Saving and Removing Files in Shiny Apps

As a developer building interactive web applications with Shiny, you often need to handle file uploads, downloads, and manipulations. One common requirement is to save the user’s input as a downloadable document, such as a Word document (.docx). In this article, we will explore how to achieve this using Shiny and R.

Introduction

Shiny applications are built using R, and they rely on various packages like shiny, rmarkdown, and rvest for interactivity and data manipulation. However, when it comes to file operations, R doesn’t provide native support out of the box. This is where we need to get creative and use other libraries to help us save and remove files.

Creating a Temporary File

One approach to saving files in Shiny apps is by creating temporary files using file.path from the utils package. We can create a file, write our input into it, perform any necessary conversions (like converting HTML to Word document), and then remove the file.

## Step 1: Create a Temporary File

library(shiny)
library(rmarkdown)

# Create a temporary file path
file1 <- file.path(tempdir(), "test.html")

## Step 2: Write Input into the File

writeLines(text = "&lt;b&gt;Sam&lt;/b&gt; &lt;i&gt;Dave&lt;/i&gt;", con = file1)

Converting HTML to Word Document

To convert our input from HTML to a Word document (.docx), we can use the rmarkdown::pandoc_convert function. This function takes our temporary file path, the target format (Word document in this case), and an optional output name.

## Step 3: Convert File Format

# Specify conversion options
options(pandoc_latex_engine = "pdflatex")
options(pandoc_widow = TRUE)

# Convert HTML to Word document
rmarkdown::pandoc_convert(file1, to = "docx", output = "word.docx")

Removing the Temporary File

After we’ve finished with our temporary file, it’s essential to remove it using file.remove to avoid running out of disk space.

## Step 4: Remove the Temporary File

# Remove the temporary file
file.remove(file1)

Combining the Code into a Shiny App

Now that we’ve covered each step individually, let’s combine them into a complete Shiny app:

library(shiny)

ui <- fluidPage(
  fluidRow(
    column(6, offset = 3,
           hr(),
           h2('Editor:'),
           textInput('editor1', 'MY TEXT',
                   HTML('&lt;b&gt;Sam&lt;/b&gt; &lt;i&gt;Dave&lt;/i&gt;'), 
                   ),
           hr(),
           h2('Editor Content:'),
           htmlOutput('editor1_content')
    )
  )
)

server <- function(input, output, session) {
  # Render the editor content
  output$editor1_content <- renderUI({
    HTML(enc2utf8(input$editor1))
  })
}

# Create a shiny app with the above UI and server
shinyApp(ui = ui, server = server)

Example Use Case

When you run this Shiny app, it will display an input field where users can type their text. When they click on the “Download” button, the app will create a temporary file containing the user’s input as HTML, convert it to a Word document (.docx), and then remove the temporary file.

Conclusion

Saving and removing files in Shiny apps is a crucial task for any interactive web application built with R. By using file.path, writeLines, rmarkdown::pandoc_convert, and file.remove, we can easily create temporary files, convert them to various formats (like Word document), and then remove them when no longer needed.

This article has provided an overview of how to achieve this using Shiny and R. While the process might seem complex at first glance, it’s actually quite straightforward once you understand the individual steps involved.


Last modified on 2023-10-01