I have included a minimal example to work with. There is a download
button, which upon click should download the shiny app screenshot as a pdf. The code is as follows.
library(shiny)
server <- function(input, output) {
output$distPlot <- renderPlot({
hist(rnorm(input$obs), col = 'darkgray', border = 'white')
})
}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("obs", "Number of observations:", min = 10, max = 500, value = 100),
actionButton("btn", "Download")
),
mainPanel(plotOutput("distPlot"))
)
)
shinyApp(ui = ui, server = server)
Thanks in advance!
Press “Windows + Shift + S”. Your screen will appear grayed out and your mouse cursor will change. Click and drag on your screen to select the part of your screen you want to capture. A screenshot of the screen region you selected will be copied to your clipboard.
If the button is pressed, the Switch takes a screenshot of whatever is being depicted on screen, but if the button is held, the Switch saves the last 30 seconds of gameplay as a video, though the latter feature often varies by game. Captured videos can also be edited and posted in a similar fashion.
For anyone who comes here after October 2020:
You can use the new shinyscreenshot package, which is as simple as calling shinyscreenshot::screenshot()
and it will download a PNG file automatically.
Example:
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)
As mentioned in the comments, I tried to use the RSelenium
package to take a screenshot inside a Shiny-App. But apparently there is the same problem as with webshots
. The session gets blocked, so phantomjs
cannot access the website.
I found a solution that works on Windows, but it requires this batch file and it will take a screenshot of the whole screen, not just the shiny-App. For Linux there are a lot of other tools which enable you to take screenshots per command-line, like ImageMagick or scrot.
Put the .bat-file in the same directory as your shiny-app, load the app, click download, allow the programm for windows/anti-virus and it will take a screenshot of your window.
You can also save several pictures, although I would come up with a more sophisticated naming method than mine. ;)
library(shiny)
library(RSelenium)
ui <- {fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("obs", "Number of observations:", min = 10, max = 500, value = 100),
actionButton("btn", "Download")
),
mainPanel(plotOutput("distPlot"))
)
)}
server <- function(input, output, session) {
output$distPlot <- renderPlot({
hist(rnorm(input$obs), col = 'darkgray', border = 'white')
})
observeEvent(input$btn, {
img = paste0("screen", runif(1,0,1000), ".png")
str = paste('call screenCapture ', img)
shell(str)
})
}
shinyApp(ui = ui, server = server)
To remove the browser and Windows toolbar, I manipulated the .bat-file a bit.
Line 66:
int height = windowRect.bottom - windowRect.top - 37;
Line 75:
GDI32.BitBlt(hdcDest, 0, -80, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
This works on my machine, but you will have to adapt the values or even come up with a better solution, since I have to admit that I'm not too good at batch scripting. This will hide the toolbars, but there will be a black strip at the bottom.
This is the experiment with RSelenium
, which did not work.
library(shiny)
library(RSelenium)
ui <- {fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("obs", "Number of observations:", min = 10, max = 500, value = 100),
actionButton("btn", "Download")
),
mainPanel(plotOutput("distPlot"))
)
)}
server <- function(input, output, session) {
output$distPlot <- renderPlot({
hist(rnorm(input$obs), col = 'darkgray', border = 'white')
})
observeEvent(input$btn, {
cdat <- session$clientData
url <- paste0(cdat$url_protocol,"//",cdat$url_hostname,":", cdat$url_port, cdat$url_pathname,cdat$url_search)
rD <- rsDriver(browser = "firefox", chromever=NULL)
remDr <- rD$client
remDr$navigate(url)
remDr$screenshot(file = tf <- tempfile(fileext = ".png"))
shell.exec(tf) # on windows
remDr$close()
rD$server$stop()
})
}
shinyApp(ui = ui, server = server)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With