Skip to content
ricochet

R

This page covers the requirements and internals of deploying R content to ricochet.

Every R deployment requires a renv.lock file in the project root. This lockfile is generated by {renv} and records all package dependencies and their versions.

[content]
name = "My Shiny App"
entrypoint = "app.R"
access_type = "external"
content_type = "shiny"
[language]
name = "r"
packages = "renv.lock"
[serve]
min_instances = 0
max_instances = 5

R content items can be deployed as apps or tasks.

Content TypeDescription
plumberAn API developed using {plumber}.
ambiorixAn API or web app developed using {ambiorix}.
shinyA web app developed using {shiny}.
rmd-shinyAn R Markdown document using a Shiny runtime.
quarto-r-shinyA Quarto document using a Shiny runtime.
serverless-rR functions deployed as an API.
r-serviceA generic web app or API using an R runtime.
Content TypeDescription
rAn R script with the extension .R or .r.
rmdAn R Markdown document. Can be served as a static site.
quarto-rA Quarto document using an R runtime. Can be served as a static site.

Ricochet discovers R installations on the host machine. We recommend installing R versions via rig for the best experience managing multiple versions:

Terminal window
rig add <version>

You can also install R from CRAN or your distribution’s package manager.

Ricochet vendors renv at $RICOCHET_HOME/vendor. When a bundle is deployed, ricochet restores R package dependencies from the renv.lock file using the vendored renv.

You can deploy and manage R content programmatically using the ricochet REST API. The examples below use {httr2}. API keys are created in the ricochet UI under Credentials → API Keys.

Bundle your project as a .tar.gz archive and upload it with the _ricochet.toml config.

library(httr2)
server <- "https://try.ricochet.rs"
api_key <- Sys.getenv("RICOCHET_API_KEY")
# Create a tar.gz bundle of the project directory
bundle_path <- tempfile(fileext = ".tar.gz")
tar(bundle_path, files = ".", compression = "gzip")
# Deploy new content
resp <- request(server) |>
req_url_path_append("api", "v0", "content", "upload") |>
req_headers(Authorization = paste("Key", api_key)) |>
req_body_multipart(
bundle = curl::form_file(bundle_path, type = "application/gzip"),
config = curl::form_file("_ricochet.toml", type = "application/toml")
) |>
req_perform()
result <- resp_body_json(resp)
result$id
#> "01JSZAXZ3TSTAYXP56ARDVFJCJ"

To redeploy existing content, pass id instead of config:

resp <- request(server) |>
req_url_path_append("api", "v0", "content", "upload") |>
req_headers(Authorization = paste("Key", api_key)) |>
req_body_multipart(
bundle = curl::form_file(bundle_path, type = "application/gzip"),
id = "01JSZAXZ3TSTAYXP56ARDVFJCJ"
) |>
req_perform()
content_id <- "01JSZAXZ3TSTAYXP56ARDVFJCJ"
resp <- request(server) |>
req_url_path_append("api", "v0", "content", content_id, "invoke") |>
req_headers(Authorization = paste("Key", api_key)) |>
req_body_json(list(params = list(n = 100))) |>
req_perform()
resp_body_json(resp)
resp <- request(server) |>
req_url_path_append("api", "v0", "user", "items") |>
req_headers(Authorization = paste("Key", api_key)) |>
req_perform()
items <- resp_body_json(resp)