MyNixOS website logo
Description

Capture Screenshots of Entire Pages or Parts of Pages in 'Shiny'.

Capture screenshots in 'Shiny' applications. Screenshots can either be of the entire viewable page, or a specific section of the page. The captured image is automatically downloaded as a PNG image, or it can also be saved on the server. Powered by the 'html2canvas' JavaScript library.

shinyscreenshot

πŸ“· Capture screenshots of entire pages or parts of pages in Shiny apps

Demo Β· by Dean Attali Β· 10-min Tutorial

R Build Status CRAN version


{shinyscreenshot} allows you to capture screenshots of entire pages or parts of pages in Shiny apps. Can be used to capture the current state of a Shiny app, including interactive widgets (such as plotly, timevis, maps, etc). The captured image is automatically downloaded as a PNG image, or it can be saved on the server.

Need Shiny help? I'm available for consulting.
If you find {shinyscreenshot} useful, please consider supporting my work! ❀

This package is part of a larger ecosystem of packages with a shared vision: solving common Shiny issues and improving Shiny apps with minimal effort, minimal code changes, and clear documentation. Other packages for your Shiny apps:

PackageDescriptionDemo
shinyjsπŸ’‘ Easily improve the user experience of your Shiny apps in secondsπŸ”—
shinyalertπŸ—―οΈ Easily create pretty popup messages (modals) in ShinyπŸ”—
timevisπŸ“… Create interactive timeline visualizations in RπŸ”—
shinycssloadersβŒ› Add loading animations to a Shiny output while it's recalculatingπŸ”—
colourpicker🎨 A colour picker tool for Shiny and for selecting colours in plotsπŸ”—
shinybrowser🌐 Find out information about a user's web browser in Shiny appsπŸ”—
shinydisconnectπŸ”Œ Show a nice message when a Shiny app disconnects or errorsπŸ”—
shinytipπŸ’¬ Simple flexible tooltips for Shiny appsWIP
shinymixpanelπŸ” Track user interactions with Mixpanel in Shiny apps or R scriptsWIP
shinyformsπŸ“ Easily create questionnaire-type forms with ShinyWIP

Table of contents

How to use

Using {shinyscreenshot} is as easy as it gets. When you want to take a screenshot, simply call screenshot() and a full-page screenshot will be taken and downloaded as a PNG image. Try it for yourself or watch a short tutorial!

It's so simple that an example isn't needed, but here's one anyway:

library(shiny)
library(shinyscreenshot)

ui <- fluidPage(
  textInput("text", "Enter some text", "test"),
  actionButton("go", "Take a screenshot")
)

server <- function(input, output) {
  observeEvent(input$go, {
    screenshot()
  })
}

shinyApp(ui, server)

Sponsors πŸ†

Become a sponsor for {shinyscreenshot}!

Screenshot button

The screenshot() function can be called any time inside the server portion of a Shiny app. A very common case is to take a screenshot after clicking a button. That case is so common that there's a function for it: screenshotButton(). It accepts all the same parameters as screenshot(), but instead of calling it in the server, you call it in the UI.

screenshotButton() creates a button that, when clicked, will take a screenshot.

Features

  • Region: By default, the entire page is captured. If you'd like to capture a specific part of the screen, you can use the selector parameter to specify a CSS selector. For example, if you have a plot with ID myplot then you can use screenshot(selector="#myplot").

  • Scale: The image file will have the same height and width as what is visible in the browser. Using screenshot(scale=2) will result in an image that's twice the height and width (and also a larger file size).

  • Timer: Usually you want the screenshot to be taken immediately, but sometimes you may want to tell Shiny to take a screenshot in, for example, 3 seconds from now. That can be done using screenshot(timer=3).

  • File name: You can choose the name of the downloaded file using the filename parameter.

  • Saving on the server: The image screenshot can also be stored on the server using the server_dir parameter. If the save is successful, input$shinyscreenshot will store the path of the image.

  • Module support: As an alternative to the selector argument, you can also use the id argument. For example, instead of using screenshot(selector="#myplot"), you could use screenshot(id="myplot"). The advantage with using an ID directly is that the id parameter is module-aware, so even if you're taking a screenshot inside a Shiny module, you don't need to worry about namespacing.

Save to server example

The example below uses the server_dir parameter to save the screenshot to the server instead of downloading it to the user's browser. As proof that the file was saved on the server-side, a preview of the file is shown. You can change the download = FALSE parameter to TRUE if you want to both save to the server and also download the file.

library(shiny)
library(shinyscreenshot)

ui <- fluidPage(
  plotly::plotlyOutput("plot"),
  screenshotButton(download = FALSE, server_dir = tempdir(), id = "plot"),
  h2("Preview of screenshot:"),
  imageOutput("preview", width = "50%", height = "200")
)

server <- function(input, output) {
  output$plot <- plotly::renderPlotly({
    plotly::plot_ly(mtcars, x = ~wt, y = ~mpg)
  })
  
  output$preview <- renderImage(deleteFile = TRUE, {
    req(input$shinyscreenshot) 
    list(src = input$shinyscreenshot, width = "100%", height = "100%")
  })
}

shinyApp(ui, server)

Installation

For most users: To install the stable CRAN version:

install.packages("shinyscreenshot")

For advanced users: To install the latest development version from GitHub:

install.packages("remotes")
remotes::install_github("daattali/shinyscreenshot")

Motivation

For years, I saw people asking online how can they take screenshots of the current state of a Shiny app. This question comes up especially with interactive outputs (plotly, timevis, maps, DT, etc). Some of these don't allow any way to save the current state as an image, and a few do have a "Save as image" option, but they only save the base/initial state of the output, rather than the current state after receiving user interaction.

After seeing many people asking about this, one day my R-friend Eric Nantz asked about it as well, which gave me the motivation to come up with a solution.

Browser support and limitations

The screenshots are powered by the 'html2canvas' JavaScript library. They do not always produce perfect screenshots, please refer to 'html2canvas' for more information about the limitations. Leaflet maps often have trouble with screenshots, and unfortunately this is a known issue that canont be fixed.

The JavaScript libraries used in this package may not be supported by all browsers. {shinyscreenshot} should work on Chrome, Firefox, Edge, Chrome on Android, Safari on iPhone (and probably more that I haven't tested). It does not work in Internet Explorer.

Similar packages

As mentioned above, the libraries used by {shinyscreenshot} do have limitations and may not always work. There are two other packages that came out recently that also provide screenshot functionality which you may try and compare: {snapper} by Jonathan Sidi and {capture} by dreamRs.

RStudio's {webshot} package is also similar, but serves a very different purpose. {webshot} is used to take screenshots of any website (including Shiny apps), but you cannot interact with the page in order to take a screenshot at a specific time.

Credits

Logo design by Alfredo HernΓ‘ndez.

Metadata

Version

0.2.1

License

Unknown

PlatformsΒ (77)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows