ZeroClipboard provides an easy way to copy text to
the clipboard using an invisible Adobe Flash movie and a JavaScript interface,
and is used e.g. by GitHub. The zeroclipr
R package is a very simple package
providing a way of creating reactive copy-to-clipboard action buttons
for Shiny R applications. The package has a
single UI component, the zeroclipButton
, but is also meant for easy
implementations of more generalized usage of ZeroClipboard.
The two necessary files ZeroClipboard.js
and ZeroClipboard.swf
are bundled
with the package, and the current included version is v2.3.0-beta.1
.
The package is not on CRAN, but can be installed from GitHub:
devtools::install_github("smbache/zeroclipr")
So far, there is only one UI
component, zeroclipButton
. This can be used
either directly in the UI for a static copy-text, or with renderUI
for a
reactive copy-text.
This example shows how to setup a button for copying data as csv to clipboard:
library(zeroclipr)
library(shiny)
runApp(list(
# The UI
ui = bootstrapPage(
# Control the styling of the button. This is not necessary but will make the
# button feel more natural, with the flash object on top:
singleton(tags$head(tags$style(
'
.zeroclipboard-is-hover { background-color: steelblue; }
.zeroclipboard-is-active { background-color: firebrick; }
'
))),
# A select input for selecting subset
selectInput("species", "Select Species: ",
choices = c("setosa", "versicolor", "virginica")),
# The UI placeholder for the copy button
uiOutput("clip"),
# A text input for testing the lipboard content.
textInput("paste", "Paste here:")
),
# The server
server = function(input, output) {
# A reactive data source, based on the input$species
species_data <- reactive({
subset(iris, Species == input$species)
})
# Create the text representation of the subset for the clipboard and
# setup the copy button.
output$clip <- renderUI({
str <- textConnection("irisdata", open = "w")
write.csv(species_data(), str, row.names = FALSE)
close(str)
zeroclipButton("clipbtn", "Copy", paste(irisdata, collapse= "\n"), icon("clipboard"))
})
}
))
The package, by design, does not ship with many different components, nor
does it try to interface all the available functionality of ZeroClipboard.js.
It merely exposes the required js
and swf
components, and makes it easy to create
whatever kind of component you need. Inspecting the included zeroclipButton
you'll see that you can easily tailor other components:
zeroclipButton <- function(inputId, label, clipText, icon = NULL, width = NULL)
{
tagList(
zeroclipboard_setup(),
actionButton(inputId = inputId, label = label, icon = icon,
width = NULL, `data-clipboard-text` = clipText),
tags$script(sprintf('var client_%s = new ZeroClipboard( $("#%1$s") );', inputId))
)
}
You just need zeroclipr
to be loaded, and to include the zeroclipboard_setup()
in your component.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.