Skip to content

Instantly share code, notes, and snippets.

@dancingfrog
Last active December 22, 2023 13:54
Show Gist options
  • Save dancingfrog/1739ea5bebe1ccaad00f59bedc10e75a to your computer and use it in GitHub Desktop.
Save dancingfrog/1739ea5bebe1ccaad00f59bedc10e75a to your computer and use it in GitHub Desktop.
.exec-shiny-app.R
#!/usr/bin/env Rscript
# Title : Execute Shiny App
# Objective : Initialize Plumber and run Shiny app as "future" (background) worker as defined by local app.R or server.R/ui.R
# Created by: John Hall
library("future")
library("httr")
library("httpuv")
library("magrittr")
library("plumber")
library("shiny")
library("stringr")
library("uuid")
library("websocket")
library("withr")
library("R6")
args <- commandArgs(trailingOnly = TRUE)
appDir <- getwd()
local_lib <- .libPaths()[1]
local_port <- as.numeric("3000")
# shiny_port <- httpuv::randomPort()
shiny_port <- if (randomPort(min = 1220L, max = 1221L, host = "127.0.0.1", n = 1)) {
1221L
} else {
httpuv::randomPort(host = "127.0.0.1", n = 20)
}
if (exists("args") && !is.null(args) && !is.na(args[1])) {
if (!grepl("install", args[1])) {
# Update path to app and lib
if (!grepl("/", args[1])) {
if (grepl("local", args[1])) {
local_lib <- paste0(getwd(), "/lib")
.libPaths(c(.libPaths(), local_lib))
} else if (dir.exists(paste0(getwd(), "/", args[1]))) {
appDir <- paste0(getwd(), "/", args[1])
}
# } else {
# appDir <- args[1]
# setwd(appDir)
} else if (dir.exists(paste0(getwd(), "/", args[1]))) {
appDir <- paste0(getwd(), "/", args[1])
} else if (dir.exists(args[1])) {
appDir <- args[1]
} else {
message(paste0("Cannot find app direcotry: ", args[1]))
stop()
}
}
if (!is.na(args[2]) && grepl("local", args[2])) {
# Install packages to ./lib instead of user library
local_lib <- paste0(getwd(), "/lib")
.libPaths(c(.libPaths(), local_lib))
} else if (!is.na(args[2]) && !grepl("install", args[2])) {
# Change server port from 3000 to ...
local_port <- switch(
as.character(as.numeric(args[2])),
"NA" = 3000,
as.numeric(args[2])
)
}
}
if (!dir.exists(local_lib)) {
dir.create(local_lib)
}
if (dir.exists("renv")) {
local_lib <- paste0("renv/library/R-", version$major, ".", substr(version$minor,1,1), "/", version$platform)
print(paste0("Use lib: ", local_lib))
if (!require("renv")) {
install.packages("renv")
}
renv::restore(library = local_lib, prompt = FALSE)
} else if (dir.exists("packrat")) tryCatch(
withr::with_libpaths(local_lib, {
if (!grepl("local", args[2]))
try({
print("Packrat config detected!")
local_lib <- paste0("packrat/lib/", version$platform, "/", version$major, ".", version$minor)
if (!file.exists(".Rprofile")) packrat::init()
system(paste0("rm -rf ", local_lib, "/00LOCK-*"))
packrat::restore(overwrite.dirty = TRUE)
})
}),
error = function(e) {
install.packages("withr")
# DEBUG
message(e)
print("Packrat config detected!")
local_lib <- paste0("packrat/lib/", version$platform, "/", version$major, ".", version$minor)
if (!file.exists(".Rprofile") && dir.exists("packrat")) packrat::init()
system(paste0("rm -rf ", local_lib, "/00LOCK-*"))
packrat::restore(overwrite.dirty = TRUE)
},
finally = print(paste0("Use lib: ", local_lib))
)
install_package_deps <- function () {
library(devtools)
no_error <- FALSE
if (any(nzchar(Sys.getenv("GITHUB_TOKEN")))) {
auth_token <- Sys.getenv("GITHUB_TOKEN")
if (!any(nzchar(Sys.getenv("GITHUB_PAT")))) {
Sys.setenv(GITHUB_PAT = auth_token)
}
} else {
auth_token <- Sys.getenv("GITHUB_PAT")
}
print(paste0("GITHUB_PAT: ", Sys.getenv("GITHUB_PAT")))
if (file.exists(paste0(appDir, "/package.csv")) || file.exists(paste0(getwd(), "/package.csv"))) {
if (!require("hrbrthemes")) {
install.packages("hrbrthemes", lib = local_lib)
hrbrthemes::import_roboto_condensed()
}
packages <- read.csv(
switch(
as.character(file.exists(paste0(appDir, "/package.csv"))),
"TRUE" = paste0(appDir, "/package.csv"),
"FALSE" = paste0(getwd(), "/package.csv")
),
header = FALSE, sep = ",", as.is = TRUE, col.names = c("package", "path_version"))
for (p in rownames(packages)) {
package_idx <- as.numeric(p)
package <- packages$package[package_idx]
print(paste0(package, ": ", packages$path_version[package_idx]))
try({
if (grepl("/", packages$path_version[package_idx])) {
github_path <- trimws(packages$path_version[package_idx])
if (!require(as.character(package[1]), character.only = TRUE)) {
message(sprintf(
'devtools::install_github("%s", lib = "%s", upgrade = "never", auth_token = "%s")',
github_path, local_lib, auth_token))
devtools::install_github(github_path, lib = local_lib, upgrade = "never", auth_token = auth_token)
}
} else {
version_string <- trimws(packages$path_version[package_idx])
if (!require(as.character(package[1]), character.only = TRUE) || version_string != as.character(packageVersion(package[1]))) {
message(sprintf(
'devtools::install_version("%s", lib = "%s", upgrade = "never", auth_token = "%s", version = "%s")',
package, local_lib, auth_token, version_string))
devtools::install_version(package, lib = local_lib, upgrade = "never", version = version_string)
}
}
})
if (!require(package[1], character.only = TRUE)) {
if (dir.exists(paste0(local_lib, "/", package[1]))) {
devtools::install_deps(paste0(local_lib, "/", package[1]), lib = local_lib, upgrade = "never", dependencies = TRUE)
}
install.packages(package, lib = local_lib)
}
}
no_error <- TRUE
}
no_error
}
no_error <- FALSE
while (!no_error) tryCatch(
withr::with_libpaths(local_lib, {
if (exists("args") && !is.null(args) && (grepl("install", args[1]) || grepl("install", args[2]))) {
if (!require("devtools") || !require("stringi") || !require("stringr")) {
install.packages(c("cli", "glue", "devtools", "stringr", "tidyverse", "usethis"), lib = local_lib)
}
no_error <- install_package_deps()
if (dir.exists("packrat") && !grepl("local", args[2])) {
if (!file.exists(".Rprofile")) packrat::init()
print("Before taking a new packrat snapshot, try to remove LOCK dirs: ")
system("mkdir -p del")
print(paste0("mv ", local_lib, "/00LOCK-* del/"))
system(paste0("mv ", local_lib, "/00LOCK-* del/"))
system("ls -l del/*")
print("rm -rf del")
system("rm -rf del")
packrat::snapshot(ignore.stale = TRUE)
print("Snapshot saved.")
print("Replace lib-R linked directory with actual libraries:")
print('for f in $(find packrat/lib-R/x86_64-pc-linux-gnu/3.5.1/ -name "[A-Za-z]*"); do lib_path=$(ls -l $f | grep -oP "(\\/var\\/.+)"); if [ $lib_path ]; then rm $f && cp -ar $lib_path packrat/lib-R/x86_64-pc-linux-gnu/3.5.1/; fi; done;')
system('for f in $(find packrat/lib-R/x86_64-pc-linux-gnu/3.5.1/ -name "[A-Za-z]*"); do lib_path=$(ls -l $f | grep -oP "(\\/var\\/.+)"); if [ $lib_path ]; then rm $f && cp -ar $lib_path packrat/lib-R/x86_64-pc-linux-gnu/3.5.1/; fi; done;')
print("Attempting bundle...")
packrat::bundle(file = "packrat.tar.gz")
if (file.exists("packrat.tar.gz")) {
print("Bundle saved.")
}
}
print("Installation finished.")
} else {
future_cluster <- future::makeClusterPSOCK(2) #future::availableCores())
parallelly::autoStopCluster(future_cluster)
for (cl_idx in seq_along(future_cluster)) {
parallel:::sendCall(future_cluster[[cl_idx]], fun = Sys.getpid, args = list())
cl_pid <- parallel:::recvResult(future_cluster[[cl_idx]])
attr(future_cluster[[cl_idx]]$host, "pid") <- cl_pid
}
future::plan(future::cluster, workers = future_cluster)
options(shiny.host = "0.0.0.0") # listen on all available network interfaces
options(shiny.port = shiny_port)
#options(shiny.launch.browser = .rs.invokeShinyWindowExternal)
print(paste0("Run Shiny app: ", appDir))
print(paste0("Use local dir: ", getwd()))
print(list.files(appDir))
print(paste0("Use local lib: ", local_lib))
print(.libPaths())
shiny_fallback_app <- shiny::shinyApp(
ui = function() { shiny::fluidPage(h1("This is a test app")) },
server = function(input, output, session) {}
)
if (grepl("/", appDir)) {
print(paste0("Launching Shiny app (http://127.0.0.1:", shiny_port, ") in future worker cluster..."))
shiny_app_future <- future::future({
shiny_app <- shiny::runApp(
app = if (file.exists(paste0(appDir, "/server.R"))) {
print(paste0("With ", appDir, "/server.R: ", file.exists(paste0(appDir, "/server.R"))))
appDir
} else if (file.exists(paste0(appDir, "/app.R"))) {
print(paste0("With ", appDir, "/app.R: ", file.exists(paste0(appDir, "/app.R"))))
appDir
} else {
shiny_fallback_app
},
host = "0.0.0.0",
port = shiny_port,
launch.browser = FALSE
)
return(NULL)
})
} else {
print(paste0("Launching Shiny app (http://127.0.0.1:", shiny_port, ") in future worker cluster..."))
shiny_app_future <- future::future({
shiny_app <- shiny::runApp(
app = if (file.exists("server.R")) {
print(paste0("With server.R: ", file.exists("server.R")))
getwd()
} else if (file.exists("app.R")) {
print(paste0("With app.R: ", file.exists("app.R")))
getwd()
} else if (file.exists("src/app.R")) {
setwd("src")
print(paste0("With app.R: ", file.exists("app.R")))
getwd()
} else {
shiny_fallback_app
},
host = "0.0.0.0",
port = shiny_port,
launch.browser = FALSE
)
return(NULL)
})
}
# From https://gabrielcp.medium.com/going-real-time-in-r-plumber-with-websockets-93547c767412
PlumberWebSocket <- R6::R6Class(
"PlumberWebSocket",
inherit = plumber::Plumber,
public = list(
onWSOpen = function(ws) {
if (is.function(private$ws_open)) {
private$ws_open(ws)
}
invisible(self)
},
websocket = function(open = NULL) {
if (!is.null(open)) stopifnot(is.function(open))
private$ws_open <- open
}
),
private = list(
ws_open = NULL
)
)
plumbr <- PlumberWebSocket$new()
plumbr$onWSOpen()
ws_clients <- list()
addWebSocketClient <- function(ws_client, message) {
ws_client$request$uuid <- UUIDgenerate()
print(ws_clients)
for(client in ws_clients) {
print(ws_clients)
print("\n")
}
print(ws_client$request$uuid %in% names(ws_clients))
if (!(ws_client$request$uuid %in% names(ws_clients))) {
ws_clients[[ws_client$request$uuid]] <<- ws_client #<<- modifies ws_clients globally
ws_client$onClose(function() {
removeWebSocketClient(ws_client$request$uuid)
})
ws_client$request$ws_shiny <- websocket::WebSocket$new(paste0("ws://127.0.0.1", ":", shiny_port, "/"))
ws_client$request$ws_shiny$connect()
ws_client$request$ws_shiny$onMessage(function(event) {
# print("Relay Shiny server event message to websocket client...")
print(event)
ws_client$send(event$data)
})
}
return(ws_clients)
}
removeWebSocketClient <- function(uuid) {
ws_clients[[uuid]] <<- NULL
}
handleWebSocketEvent <- function(pr) {
pr$websocket(
function (ws_client) {
addWebSocketClient(ws_client)
print("New user connected!")
ws_client$onMessage(function(binary, event) {
if ("ws_shiny" %in% names(ws_client$request)) {
# print("Relay websocket message to Shiny server...")
# print(event)
Sys.sleep(0.0125)
ws_client$request$ws_shiny$send(as.character(event))
}
})
}
)
pr
}
handleFileRequests <- function (req, res) {
cat(paste0("http://", req$REMOTE_ADDR, ":", shiny_port, req$PATH_INFO, "\n"))
file_path <- stringr::str_replace_all(req$PATH_INFO, "/www", "")
cat(paste0(file_path, "\n"))
# httr_target <- httr::GET(paste0("http://", req$REMOTE_ADDR, ":", shiny_port, file_path))
httr_target <- httr::GET(paste0("http://127.0.0.1:", shiny_port, file_path))
# print(names(req$HEADERS))
print(req$HEADERS["accept"])
if (
grepl("gif", req$HEADERS["accept"]) ||
grepl("jpeg", req$HEADERS["accept"]) ||
grepl("png", req$HEADERS["accept"]) ||
grepl("woff", req$HEADERS["accept"])
) {
httr_result <- httr::content(httr_target, as = "raw")
print("requesting binary file")
# print(as.character(httr_result))
} else {
httr_result <- httr::content(httr_target, as = "text", encoding ="UTF-8")
# print(httr_result)
}
httr_result
}
plumbr %>%
handleWebSocketEvent %>%
plumber::pr_filter("globalFilter", function (req, res) {
cat(as.character(Sys.time()), "-",
req$REQUEST_METHOD, req$PATH_INFO, "-",
req$HTTP_USER_AGENT, "@", req$REMOTE_ADDR, "\n"
)
## API && Swagger Filter ----
if (as.character(req$PATH_INFO) != "/" &&
!grepl("/__api__", as.character(req$PATH_INFO)) &&
!grepl("/__docs__", as.character(req$PATH_INFO)) &&
!grepl("/openapi", as.character(req$PATH_INFO))
) {
# Process file request as if it had the static file prefix ("www/")
req$PATH_INFO <- paste0("/www", as.character(req$PATH_INFO))
} # else { Let default plumber handlers process API and/or Swagger __docs__ request }
## CORS access
res$setHeader("Access-Control-Allow-Origin", "*")
if (req$REQUEST_METHOD == "OPTIONS") {
res$setHeader("Access-Control-Allow-Methods","*")
res$setHeader("Access-Control-Allow-Headers", req$HTTP_ACCESS_CONTROL_REQUEST_HEADERS)
res$status <- 200
return(list())
} else {
plumber::forward()
}
}) %>%
plumber::pr_mount("/__api__", pr("modules/plumber.R")) %>% # <- mount additional routes under "/__api__" %>%
(function (pr) {
## Proxy routes to files served by Shiny app ----
pr %>%
plumber::pr_handle(c("GET", "POST"), "/", function (req, res) {
# "<html>
# <h1>Hello, World!</h1>
# </html>"
handleFileRequests(req, res)
}, serializer = plumber::serializer_html()) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<file>.css", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "text/css"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<file>.js", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "application/javascript"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<file>.svg", function (file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "image/svg+xml"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<file>.woff2", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_octet(
serialize_fn = as.raw,
type = "application/font-woff2"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<file>", function (file, req, res) {
handleFileRequests(req, res)
}) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.css", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "text/css"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.gif", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_png(
serialize_fn = as.raw,
type = "image/gif"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.jpeg", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_jpeg(
serialize_fn = as.raw,
type = "image/jpeg"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.jpg", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_jpeg(
serialize_fn = as.raw,
type = "image/jpeg"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.js", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "application/javascript"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.pdf", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_pdf(
serialize_fn = as.raw,
type = "application/pdf"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.png", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_png(
serialize_fn = as.raw,
type = "image/png"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.svg", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "image/svg+xml"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>.woff2", function (path1, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_octet(
serialize_fn = as.raw,
type = "application/font-woff2"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<file>", function (path1, file, req, res) {
handleFileRequests(req, res)
}) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<path2>/<file>.css", function (path1, path2, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "text/css"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<path2>/<file>.js", function (path1, path2, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "application/javascript"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<path2>/<file>", function (path1, path2, file, req, res) {
handleFileRequests(req, res)
}) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<path2>/<path3>/<file>.css", function (path1, path2, path3, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "text/css"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<path2>/<path3>/<file>.js", function (path1, path2, path3, file, req, res) {
handleFileRequests(req, res)
}, serializer = plumber::serializer_text(
serialize_fn = as.character,
type = "application/javascript"
)) %>%
plumber::pr_handle(c("GET", "POST"), "/www/<path1>/<path2>/<path3>/<file>", function (path1, path2, path3, file, req, res) {
handleFileRequests(req, res)
}) %>%
plumber::pr_static("/www/", "www/")
# return(pr)
})() %>%
plumber::pr_hook("exit", function(){
print("Stop the future cluster (bg workers)...")
try({
tryCatch(
{
future_host <- shiny_app_future$workers[[shiny_app_future$node]]$host
print(future_host)
pid <- attr(future_host, "pid")
print(pid)
tools::pskill(pid)
},
finally = function () {
parallel::stopCluster(future_cluster)
}
)
})
print("Done!")
}) %>%
plumber::pr_run(
host = "0.0.0.0",
port = local_port
)
}
no_error <- TRUE
}),
error = function(e) {
# DEBUG
message(e)
#if (!no_error) {
if (!is.null(e) && !is.na(e$message) && grepl("package", e$message))
withr::with_libpaths(local_lib, {
print(sprintf("ERROR: %s", e$message))
str_pattern <- paste0("(?:package\\scalled|namespace) ['|‘]([\\w]+)")
package_match <- stringr::str_match(e$message, str_pattern)[,2]
print(paste0("Missing package match: ", package_match))
if (!is.null(package_match) && !is.na(package_match) && !require(package_match[1], character.only = TRUE)) {
if (dir.exists(paste0(local_lib, "/", package_match))) {
if (!require("devtools") || !require("stringi") || !require("stringr")) {
install.packages(c("cli", "glue", "devtools", "stringr", "tidyverse", "usethis"))
}
devtools::install_deps(paste0(local_lib, "/", package_match), lib = local_lib, upgrade = "never", dependencies = TRUE)
}
install.packages(package_match, lib = local_lib)
}
install_package_deps()
})
else quit(save = "no", status = 1, runLast = FALSE)
},
finally = "Shiny app terminated."
)
*.bak
*.env*
*.idea
.R*
*.Rproj*
renv/lib*
rsconnect
# History files
.Rhistory
.Rapp.history
# Session Data files
.RData
# User-specific files
.Ruserdata
# Example code in package build process
*-Ex.R
# Output files from R CMD build
/*.tar.gz
# Output files from R CMD check
/*.Rcheck/
# RStudio files
.Rproj.user/
# produced vignettes
vignettes/*.html
vignettes/*.pdf
# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3
.httr-oauth
# knitr and R markdown default cache directories
*_cache/
/cache/
# Temporary files created by R markdown
*.utf8.md
*.knit.md
# R Environment Variables
.Renviron
.CARTOenv
# data
*.csv
*.gpkg
*.shp
*.RDS
*.rds
*.Rds
app/
backend/
bcat/
build/
dashboard/
dist/
frontend/
logs/
modules/
node_modules/
packrat/
renv/
rom-scrollytelling-article/
[submodule "shiny-server"]
path = shiny-server
url = https://github.com/dancingfrog/cori-app-reprex.git
---
title: "README"
author: John Hall
date: 3/29/2021
output: md_document
---
Use the `.exec-shiny-app.R` script to launch a Shiny app anywhere on local disk. If you need to install packages to a local library, make sure to set/export `GITHUB_PAT` in the system environment with a token from Github (R command: `usethis::create_github_token()`) before running this script:
Rscript .exec-shiny-app.R <optional:path-to-shiny-app-dir> <optional:port>
If either the target app directory or the current working directory contain a `package.csv` file and `install` is specified as either the first or secondary argument (instead of the port number), the script can install the dependencies listed in that file. If the script initially fails to run the target Shiny app, it will also attempt to install dependencies. A `package.csv` file has been provided as an example.
This script now comes with a minimal set of dependency packages, defined by `renv.lock`. After initially cloning the repository, start an interactive R session in the root directory and run:
renv::activate()
FROM public.ecr.aws/l2v0f2h3/rocker/shiny-verse:latest as base
ARG gh_token
ENV GITHUB_TOKEN=$gh_token
ARG gh_token
ENV GITHUB_PAT=$gh_token
RUN apt update -y && \
apt purge -y ca-certificates-java && apt install -y ca-certificates-java \
&& apt install -y ca-certificates libgdal-dev libharfbuzz-dev libfribidi-dev libv8-dev libjq-dev \
libmagick++-dev libprotobuf-dev protobuf-compiler libudunits2-dev procps libsodium-dev libudunits2-dev \
&& update-ca-certificates -f -v
RUN Rscript -e '\
local({ r <- getOption("repos"); r["CRAN"] <- "http://cran.r-project.org"; options(repos=r); }); \
update.packages(ask = FALSE, checkBuilt = TRUE); \
install.packages(c( \
"R6", "cli", "devtools", "future", "geojsonio", "hrbrthemes", "httr", "httpuv", "leaflet", "magick", "packrat", "plumber", \
"remoter", "remotes", "renv", "sf", "shiny", "stringi", "stringr", "tidyverse", "tools", "uuid", "websocket", "withr" \
));'
RUN chmod -R ga+rw /srv/shiny-server/*
RUN chmod +x /srv/shiny-server/.exec-shiny-app.R
#CMD /usr/bin/bash
CMD /usr/bin/shiny-server
## ^ #FROM public.ecr.aws/l2v0f2h3/rocker/shiny-verse
#
#WORKDIR /srv/shiny-server
#
#COPY renv.lock renv.lock
#
#RUN Rscript -e '\
# version; \
# print(paste0("GITHUB_PAT: ", Sys.getenv("GITHUB_PAT"))); \
# renv::activate(); \
# renv::restore(clean = FALSE); \
#'
#
#COPY .exec-shiny-app.R .exec-shiny-app.R
### Fix incorrect (windows) line-ending that keep this script from running on linux
#RUN bash -c "cp .exec-shiny-app.R .exec-shiny-app.R.bak && \
# sed $'s/\r$//' .exec-shiny-app.R.bak > .exec-shiny-app.R && \
# chmod +x .exec-shiny-app.R; \
#"
#
#RUN chmod -R ga+rw /srv/shiny-server/*
#RUN chmod +x /srv/shiny-server/.exec-shiny-app.R
#
##CMD /usr/bin/bash
##CMD /usr/bin/shiny-server
#CMD /srv/shiny-server/.exec-shiny-app.R
#
#ENTRYPOINT [ "Rscript" ]
EXPOSE 3000
EXPOSE 3838
# ^ #FROM 312512371189.dkr.ecr.us-east-1.amazonaws.com/coriverse/shinyapps:latest
# https://stackoverflow.com/questions/13735745/locate-the-rprofile-file-generating-default-options
candidates <- c( Sys.getenv("R_PROFILE"),
file.path(Sys.getenv("R_HOME"), "etc", "Rprofile.site"),
Sys.getenv("R_PROFILE_USER"),
file.path(getwd(), ".Rprofile"),
file.path(Sys.getenv("HOME"), ".Rprofile"))
Filter(file.exists, candidates)
dplyr 1.0.7
ellipsis 0.3.2
geojson 0.3.4
geojsonio 0.9.4
gert 1.4.3
ggfittext 0.6.0
gh 1.3.0
glue 1.5.0
nanotime 0.1.2
pkgload 1.2.3
readr 1.4.0
remotes 2.4.1
shinyWidgets 0.5.4
treemapify 2.5.2
vctrs 0.3.8
usethis 2.1.3
R.utils HenrikBengtsson/R.utils
htmltools rstudio/htmltools
hrbrthemes hrbrmstr/hrbrthemes
janitor sfirke/janitor
jobbR dashee87/jobbR
shiny rstudio/shiny
colourpicker daattali/colourpicker
DT rstudio/DT
forecast robjhyndman/forecast
knitr yihui/knitr
tidyverse tidyverse/tidyverse
shinyBS ebailey78/shinyBS
shinydashboard rstudio/shinydashboard
shinycssloaders daattali/shinycssloaders
shinycustomloader emitanaka/shinycustomloader
shinyjs daattali/shinyjs
shinylogs dreamRs/shinylogs
shinythemes rstudio/shinythemes
kableExtra haozhu233/kableExtra
rmarkdown rstudio/rmarkdown
scales r-lib/scales
sf r-spatial/sf
spatstat.utils spatstat/spatstat.utils
spatstat spatstat/spatstat
spatstat spatstat/spatstat
coriverse ruralinnovation/coriverse@cea7d0393a9b680e02414dec0e5a6f11761647eb
geojsonsf SymbolixAU/geojsonsf
leaflet rstudio/leaflet
leaflet.extras bhaskarvk/leaflet.extras
plotly ropensci/plotly
r2d3 rstudio/r2d3
polyclip https://cran.r-project.org/src/contrib/polyclip_1.10-0.tar.gz
protolite jeroen/protolite
rmapshaper ateucher/rmapshaper
shinymaptool ruralinnovation/shinymaptool@21c506b274d55b026bbc1ba80b92e1d222e064ea
yaml viking/r-yaml
zoo r-forge/zoo
{
"name": "exec-scripts",
"private": true,
"version": "0.0.1",
"scripts": {
"start": "Rscript .exec-shiny-app.R . 5174"
},
"devDependencies": {
"node-fetch": "^3.3.1"
}
}
{
"R": {
"Version": "4.1.2",
"Repositories": [
{
"Name": "CRAN",
"URL": "http://cran.rstudio.com"
}
]
},
"Packages": {
"AsioHeaders": {
"Package": "AsioHeaders",
"Version": "1.22.1-1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "57ed34bcad0158fafd9cbdd85bd26881",
"Requirements": []
},
"DBI": {
"Package": "DBI",
"Version": "1.1.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "b2866e62bab9378c3cc9476a1954226b",
"Requirements": []
},
"MASS": {
"Package": "MASS",
"Version": "7.3-55",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c5232ffb549f6d7a04a152c34ca1353d",
"Requirements": []
},
"Matrix": {
"Package": "Matrix",
"Version": "1.4-0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "130c0caba175739d98f2963c6a407cf6",
"Requirements": [
"lattice"
]
},
"R.methodsS3": {
"Package": "R.methodsS3",
"Version": "1.8.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "278c286fd6e9e75d0c2e8f731ea445c8",
"Requirements": []
},
"R.oo": {
"Package": "R.oo",
"Version": "1.25.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a0900a114f4f0194cf4aa8cd4a700681",
"Requirements": [
"R.methodsS3"
]
},
"R.utils": {
"Package": "R.utils",
"Version": "2.12.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "325f01db13da12c04d8f6e7be36ff514",
"Requirements": [
"R.methodsS3",
"R.oo"
]
},
"R6": {
"Package": "R6",
"Version": "2.5.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "470851b6d5d0ac559e9d01bb352b4021",
"Requirements": []
},
"RColorBrewer": {
"Package": "RColorBrewer",
"Version": "1.1-3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "45f0398006e83a5b10b72a90663d8d8c",
"Requirements": []
},
"Rcpp": {
"Package": "Rcpp",
"Version": "1.0.9",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "e9c08b94391e9f3f97355841229124f2",
"Requirements": []
},
"Rttf2pt1": {
"Package": "Rttf2pt1",
"Version": "1.3.11",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "60818466bde87943f750b33b5ef5217b",
"Requirements": []
},
"askpass": {
"Package": "askpass",
"Version": "1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "e8a22846fff485f0be3770c2da758713",
"Requirements": [
"sys"
]
},
"assertthat": {
"Package": "assertthat",
"Version": "0.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "50c838a310445e954bc13f26f26a6ecf",
"Requirements": []
},
"backports": {
"Package": "backports",
"Version": "1.4.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c39fbec8a30d23e721980b8afb31984c",
"Requirements": []
},
"base64enc": {
"Package": "base64enc",
"Version": "0.1-3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "543776ae6848fde2f48ff3816d0628bc",
"Requirements": []
},
"bit": {
"Package": "bit",
"Version": "4.0.5",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "d242abec29412ce988848d0294b208fd",
"Requirements": []
},
"bit64": {
"Package": "bit64",
"Version": "4.0.5",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "9fe98599ca456d6552421db0d6772d8f",
"Requirements": [
"bit"
]
},
"blob": {
"Package": "blob",
"Version": "1.2.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "10d231579bc9c06ab1c320618808d4ff",
"Requirements": [
"rlang",
"vctrs"
]
},
"brew": {
"Package": "brew",
"Version": "1.0-8",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "d69a786e85775b126bddbee185ae6084",
"Requirements": []
},
"brio": {
"Package": "brio",
"Version": "1.1.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "976cf154dfb043c012d87cddd8bca363",
"Requirements": []
},
"broom": {
"Package": "broom",
"Version": "1.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c90ff735b7812b60f067a3f7a3b4de63",
"Requirements": [
"backports",
"dplyr",
"ellipsis",
"generics",
"ggplot2",
"glue",
"purrr",
"rlang",
"stringr",
"tibble",
"tidyr"
]
},
"bslib": {
"Package": "bslib",
"Version": "0.4.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "89a0cd0c45161e3bd1c1e74a2d65e516",
"Requirements": [
"cachem",
"htmltools",
"jquerylib",
"jsonlite",
"memoise",
"rlang",
"sass"
]
},
"cachem": {
"Package": "cachem",
"Version": "1.0.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "648c5b3d71e6a37e3043617489a0a0e9",
"Requirements": [
"fastmap",
"rlang"
]
},
"callr": {
"Package": "callr",
"Version": "3.7.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "9b2191ede20fa29828139b9900922e51",
"Requirements": [
"R6",
"processx"
]
},
"cellranger": {
"Package": "cellranger",
"Version": "1.1.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f61dbaec772ccd2e17705c1e872e9e7c",
"Requirements": [
"rematch",
"tibble"
]
},
"cli": {
"Package": "cli",
"Version": "3.4.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "0d297d01734d2bcea40197bd4971a764",
"Requirements": []
},
"clipr": {
"Package": "clipr",
"Version": "0.8.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "3f038e5ac7f41d4ac41ce658c85e3042",
"Requirements": []
},
"codetools": {
"Package": "codetools",
"Version": "0.2-18",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "019388fc48e48b3da0d3a76ff94608a8",
"Requirements": []
},
"colorspace": {
"Package": "colorspace",
"Version": "2.0-3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "bb4341986bc8b914f0f0acf2e4a3f2f7",
"Requirements": []
},
"commonmark": {
"Package": "commonmark",
"Version": "1.8.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "b6e3e947d1d7ebf3d2bdcea1bde63fe7",
"Requirements": []
},
"cpp11": {
"Package": "cpp11",
"Version": "0.4.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "ed588261931ee3be2c700d22e94a29ab",
"Requirements": []
},
"crayon": {
"Package": "crayon",
"Version": "1.5.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "e8a1e41acf02548751f45c718d55aa6a",
"Requirements": []
},
"credentials": {
"Package": "credentials",
"Version": "1.3.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "93762d0a34d78e6a025efdbfb5c6bb41",
"Requirements": [
"askpass",
"curl",
"jsonlite",
"openssl",
"sys"
]
},
"curl": {
"Package": "curl",
"Version": "4.3.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "0eb86baa62f06e8855258fa5a8048667",
"Requirements": []
},
"data.table": {
"Package": "data.table",
"Version": "1.14.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "aecef50008ea7b57c76f1cb5c127fb02",
"Requirements": []
},
"dbplyr": {
"Package": "dbplyr",
"Version": "2.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f6c7eb9617e4d2a86bb7182fff99c805",
"Requirements": [
"DBI",
"R6",
"assertthat",
"blob",
"cli",
"dplyr",
"glue",
"lifecycle",
"magrittr",
"pillar",
"purrr",
"rlang",
"tibble",
"tidyselect",
"vctrs",
"withr"
]
},
"desc": {
"Package": "desc",
"Version": "1.4.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6b9602c7ebbe87101a9c8edb6e8b6d21",
"Requirements": [
"R6",
"cli",
"rprojroot"
]
},
"devtools": {
"Package": "devtools",
"Version": "2.4.5",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "ea5bc8b4a6a01e4f12d98b58329930bb",
"Requirements": [
"cli",
"desc",
"ellipsis",
"fs",
"lifecycle",
"memoise",
"miniUI",
"pkgbuild",
"pkgdown",
"pkgload",
"profvis",
"rcmdcheck",
"remotes",
"rlang",
"roxygen2",
"rversions",
"sessioninfo",
"testthat",
"urlchecker",
"usethis",
"withr"
]
},
"diffobj": {
"Package": "diffobj",
"Version": "0.3.5",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "bcaa8b95f8d7d01a5dedfd959ce88ab8",
"Requirements": [
"crayon"
]
},
"digest": {
"Package": "digest",
"Version": "0.6.30",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "bf1cd206a5d170d132ef75c7537b9bdb",
"Requirements": []
},
"downlit": {
"Package": "downlit",
"Version": "0.4.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "79bf3f66590752ffbba20f8d2da94c7c",
"Requirements": [
"brio",
"desc",
"digest",
"evaluate",
"fansi",
"memoise",
"rlang",
"vctrs",
"withr",
"yaml"
]
},
"dplyr": {
"Package": "dplyr",
"Version": "1.0.10",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "539412282059f7f0c07295723d23f987",
"Requirements": [
"R6",
"generics",
"glue",
"lifecycle",
"magrittr",
"pillar",
"rlang",
"tibble",
"tidyselect",
"vctrs"
]
},
"dtplyr": {
"Package": "dtplyr",
"Version": "1.2.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c5f8828a0b459a703db190b001ad4818",
"Requirements": [
"crayon",
"data.table",
"dplyr",
"ellipsis",
"glue",
"lifecycle",
"rlang",
"tibble",
"tidyselect",
"vctrs"
]
},
"ellipsis": {
"Package": "ellipsis",
"Version": "0.3.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "bb0eec2fe32e88d9e2836c2f73ea2077",
"Requirements": [
"rlang"
]
},
"evaluate": {
"Package": "evaluate",
"Version": "0.18",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6b6c0f8467cd4ce0b500cabbc1bd1763",
"Requirements": []
},
"extrafont": {
"Package": "extrafont",
"Version": "0.18",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "07a8a50195fc77e8690fd8bc4e87e6a0",
"Requirements": [
"Rttf2pt1",
"extrafontdb"
]
},
"extrafontdb": {
"Package": "extrafontdb",
"Version": "1.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a861555ddec7451c653b40e713166c6f",
"Requirements": []
},
"fansi": {
"Package": "fansi",
"Version": "1.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "83a8afdbe71839506baa9f90eebad7ec",
"Requirements": []
},
"farver": {
"Package": "farver",
"Version": "2.1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "8106d78941f34855c440ddb946b8f7a5",
"Requirements": []
},
"fastmap": {
"Package": "fastmap",
"Version": "1.1.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "77bd60a6157420d4ffa93b27cf6a58b8",
"Requirements": []
},
"fontawesome": {
"Package": "fontawesome",
"Version": "0.4.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c5a628c2570aa86a96cc6ef739d8bfda",
"Requirements": [
"htmltools",
"rlang"
]
},
"forcats": {
"Package": "forcats",
"Version": "0.5.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "9d95bc88206321cd1bc98480ecfd74bb",
"Requirements": [
"cli",
"ellipsis",
"glue",
"lifecycle",
"magrittr",
"rlang",
"tibble",
"withr"
]
},
"fs": {
"Package": "fs",
"Version": "1.5.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "7c89603d81793f0d5486d91ab1fc6f1d",
"Requirements": []
},
"future": {
"Package": "future",
"Version": "1.29.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "783c201d2edfee73263de8e17cbdfa8e",
"Requirements": [
"digest",
"globals",
"listenv",
"parallelly"
]
},
"gargle": {
"Package": "gargle",
"Version": "1.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "cca71329ad88e21267f09255d3f008c2",
"Requirements": [
"cli",
"fs",
"glue",
"httr",
"jsonlite",
"rappdirs",
"rlang",
"rstudioapi",
"withr"
]
},
"gdtools": {
"Package": "gdtools",
"Version": "0.2.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "bdfa7431687797edff8c9b0eb9271cc8",
"Requirements": [
"Rcpp",
"systemfonts"
]
},
"generics": {
"Package": "generics",
"Version": "0.1.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "15e9634c0fcd294799e9b2e929ed1b86",
"Requirements": []
},
"gert": {
"Package": "gert",
"Version": "1.9.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "9a091a6d2fb91e43afd4337e2dcef2e7",
"Requirements": [
"askpass",
"credentials",
"openssl",
"rstudioapi",
"sys",
"zip"
]
},
"ggplot2": {
"Package": "ggplot2",
"Version": "3.4.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "fd2aab12f54400c6bca43687231e246b",
"Requirements": [
"MASS",
"cli",
"glue",
"gtable",
"isoband",
"lifecycle",
"mgcv",
"rlang",
"scales",
"tibble",
"vctrs",
"withr"
]
},
"gh": {
"Package": "gh",
"Version": "1.3.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "b6a12054ee13dce0f6696c019c10e539",
"Requirements": [
"cli",
"gitcreds",
"httr",
"ini",
"jsonlite"
]
},
"gitcreds": {
"Package": "gitcreds",
"Version": "0.1.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "ab08ac61f3e1be454ae21911eb8bc2fe",
"Requirements": []
},
"globals": {
"Package": "globals",
"Version": "0.16.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "baa9585ab4ce47a9f4618e671778cc6f",
"Requirements": [
"codetools"
]
},
"glue": {
"Package": "glue",
"Version": "1.6.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "4f2596dfb05dac67b9dc558e5c6fba2e",
"Requirements": []
},
"googledrive": {
"Package": "googledrive",
"Version": "2.0.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c3a25adbbfbb03f12e6f88c5fb1f3024",
"Requirements": [
"cli",
"gargle",
"glue",
"httr",
"jsonlite",
"lifecycle",
"magrittr",
"pillar",
"purrr",
"rlang",
"tibble",
"uuid",
"vctrs",
"withr"
]
},
"googlesheets4": {
"Package": "googlesheets4",
"Version": "1.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "3b449d5292327880fc6cb61d0b2e9063",
"Requirements": [
"cellranger",
"cli",
"curl",
"gargle",
"glue",
"googledrive",
"httr",
"ids",
"magrittr",
"purrr",
"rematch2",
"rlang",
"tibble",
"vctrs"
]
},
"gtable": {
"Package": "gtable",
"Version": "0.3.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "36b4265fb818f6a342bed217549cd896",
"Requirements": []
},
"haven": {
"Package": "haven",
"Version": "2.5.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "5b45a553fca2217a07b6f9c843304c44",
"Requirements": [
"cli",
"cpp11",
"forcats",
"hms",
"lifecycle",
"readr",
"rlang",
"tibble",
"tidyselect",
"vctrs"
]
},
"highr": {
"Package": "highr",
"Version": "0.9",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "8eb36c8125038e648e5d111c0d7b2ed4",
"Requirements": [
"xfun"
]
},
"hms": {
"Package": "hms",
"Version": "1.1.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "41100392191e1244b887878b533eea91",
"Requirements": [
"ellipsis",
"lifecycle",
"pkgconfig",
"rlang",
"vctrs"
]
},
"hrbrthemes": {
"Package": "hrbrthemes",
"Version": "0.8.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "0d1257948f016840ad90320ed19c8c7d",
"Requirements": [
"extrafont",
"gdtools",
"ggplot2",
"htmltools",
"knitr",
"magrittr",
"rmarkdown",
"scales"
]
},
"htmltools": {
"Package": "htmltools",
"Version": "0.5.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6496090a9e00f8354b811d1a2d47b566",
"Requirements": [
"base64enc",
"digest",
"fastmap",
"rlang"
]
},
"htmlwidgets": {
"Package": "htmlwidgets",
"Version": "1.5.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "76147821cd3fcd8c4b04e1ef0498e7fb",
"Requirements": [
"htmltools",
"jsonlite",
"yaml"
]
},
"httpuv": {
"Package": "httpuv",
"Version": "1.6.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "fd090e236ae2dc0f0cdf33a9ec83afb6",
"Requirements": [
"R6",
"Rcpp",
"later",
"promises"
]
},
"httr": {
"Package": "httr",
"Version": "1.4.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "57557fac46471f0dbbf44705cc6a5c8c",
"Requirements": [
"R6",
"curl",
"jsonlite",
"mime",
"openssl"
]
},
"ids": {
"Package": "ids",
"Version": "1.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "99df65cfef20e525ed38c3d2577f7190",
"Requirements": [
"openssl",
"uuid"
]
},
"ini": {
"Package": "ini",
"Version": "0.3.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6154ec2223172bce8162d4153cda21f7",
"Requirements": []
},
"isoband": {
"Package": "isoband",
"Version": "0.2.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "cfdea9dea85c1a973991c8cbe299f4da",
"Requirements": []
},
"jquerylib": {
"Package": "jquerylib",
"Version": "0.1.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "5aab57a3bd297eee1c1d862735972182",
"Requirements": [
"htmltools"
]
},
"jsonlite": {
"Package": "jsonlite",
"Version": "1.8.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "8b1bd0be62956f2a6b91ce84fac79a45",
"Requirements": []
},
"knitr": {
"Package": "knitr",
"Version": "1.41",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6d4971f3610e75220534a1befe81bc92",
"Requirements": [
"evaluate",
"highr",
"stringr",
"xfun",
"yaml"
]
},
"labeling": {
"Package": "labeling",
"Version": "0.4.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "3d5108641f47470611a32d0bdf357a72",
"Requirements": []
},
"later": {
"Package": "later",
"Version": "1.3.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "7e7b457d7766bc47f2a5f21cc2984f8e",
"Requirements": [
"Rcpp",
"rlang"
]
},
"lattice": {
"Package": "lattice",
"Version": "0.20-45",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "b64cdbb2b340437c4ee047a1f4c4377b",
"Requirements": []
},
"lifecycle": {
"Package": "lifecycle",
"Version": "1.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "001cecbeac1cff9301bdc3775ee46a86",
"Requirements": [
"cli",
"glue",
"rlang"
]
},
"listenv": {
"Package": "listenv",
"Version": "0.8.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "0bde42ee282efb18c7c4e63822f5b4f7",
"Requirements": []
},
"lubridate": {
"Package": "lubridate",
"Version": "1.9.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "2af4550c2f0f7fbe7cbbf3dbf4ea3902",
"Requirements": [
"generics",
"timechange"
]
},
"magrittr": {
"Package": "magrittr",
"Version": "2.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "7ce2733a9826b3aeb1775d56fd305472",
"Requirements": []
},
"memoise": {
"Package": "memoise",
"Version": "2.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c",
"Requirements": [
"cachem",
"rlang"
]
},
"mgcv": {
"Package": "mgcv",
"Version": "1.8-39",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "055265005c238024e306fe0b600c89ff",
"Requirements": [
"Matrix",
"nlme"
]
},
"mime": {
"Package": "mime",
"Version": "0.12",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "18e9c28c1d3ca1560ce30658b22ce104",
"Requirements": []
},
"miniUI": {
"Package": "miniUI",
"Version": "0.1.1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "fec5f52652d60615fdb3957b3d74324a",
"Requirements": [
"htmltools",
"shiny"
]
},
"modelr": {
"Package": "modelr",
"Version": "0.1.10",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "bc23cda9c6a8f91dc1c10e1994494711",
"Requirements": [
"broom",
"magrittr",
"purrr",
"rlang",
"tibble",
"tidyr",
"tidyselect",
"vctrs"
]
},
"munsell": {
"Package": "munsell",
"Version": "0.5.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6dfe8bf774944bd5595785e3229d8771",
"Requirements": [
"colorspace"
]
},
"nlme": {
"Package": "nlme",
"Version": "3.1-155",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "74ad940dccc9e977189a5afe5fcdb7ba",
"Requirements": [
"lattice"
]
},
"openssl": {
"Package": "openssl",
"Version": "2.0.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "e86c5ffeb8474a9e03d75f5d2919683e",
"Requirements": [
"askpass"
]
},
"packrat": {
"Package": "packrat",
"Version": "0.8.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "d84055adcb6bb1f4f0ce8c5f235bc328",
"Requirements": []
},
"parallelly": {
"Package": "parallelly",
"Version": "1.32.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "9e3d8d65cb9c5ca5966340a6bfec60b2",
"Requirements": []
},
"pillar": {
"Package": "pillar",
"Version": "1.8.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f2316df30902c81729ae9de95ad5a608",
"Requirements": [
"cli",
"fansi",
"glue",
"lifecycle",
"rlang",
"utf8",
"vctrs"
]
},
"pkgbuild": {
"Package": "pkgbuild",
"Version": "1.4.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "d6c3008d79653a0f267703288230105e",
"Requirements": [
"R6",
"callr",
"cli",
"crayon",
"desc",
"prettyunits",
"processx",
"rprojroot",
"withr"
]
},
"pkgconfig": {
"Package": "pkgconfig",
"Version": "2.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "01f28d4278f15c76cddbea05899c5d6f",
"Requirements": []
},
"pkgdown": {
"Package": "pkgdown",
"Version": "2.0.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f958d0b2a5dabc5ffd414f062b1ffbe7",
"Requirements": [
"bslib",
"callr",
"cli",
"desc",
"digest",
"downlit",
"fs",
"httr",
"jsonlite",
"magrittr",
"memoise",
"purrr",
"ragg",
"rlang",
"rmarkdown",
"tibble",
"whisker",
"withr",
"xml2",
"yaml"
]
},
"pkgload": {
"Package": "pkgload",
"Version": "1.3.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6b0c222c5071efe0f3baf3dae9aa40e2",
"Requirements": [
"cli",
"crayon",
"desc",
"fs",
"glue",
"rlang",
"rprojroot",
"withr"
]
},
"plumber": {
"Package": "plumber",
"Version": "1.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "8b65a7a00ef8edc5ddc6fabf0aff1194",
"Requirements": [
"R6",
"crayon",
"ellipsis",
"httpuv",
"jsonlite",
"lifecycle",
"magrittr",
"mime",
"promises",
"rlang",
"sodium",
"stringi",
"swagger",
"webutils"
]
},
"praise": {
"Package": "praise",
"Version": "1.0.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a555924add98c99d2f411e37e7d25e9f",
"Requirements": []
},
"prettyunits": {
"Package": "prettyunits",
"Version": "1.1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "95ef9167b75dde9d2ccc3c7528393e7e",
"Requirements": []
},
"processx": {
"Package": "processx",
"Version": "3.8.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a33ee2d9bf07564efb888ad98410da84",
"Requirements": [
"R6",
"ps"
]
},
"profvis": {
"Package": "profvis",
"Version": "0.3.7",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "e9d21e79848e02e524bea6f5bd53e7e4",
"Requirements": [
"htmlwidgets",
"stringr"
]
},
"progress": {
"Package": "progress",
"Version": "1.2.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "14dc9f7a3c91ebb14ec5bb9208a07061",
"Requirements": [
"R6",
"crayon",
"hms",
"prettyunits"
]
},
"promises": {
"Package": "promises",
"Version": "1.2.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "4ab2c43adb4d4699cf3690acd378d75d",
"Requirements": [
"R6",
"Rcpp",
"later",
"magrittr",
"rlang"
]
},
"ps": {
"Package": "ps",
"Version": "1.7.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "68dd03d98a5efd1eb3012436de45ba83",
"Requirements": []
},
"purrr": {
"Package": "purrr",
"Version": "0.3.5",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "54842a2443c76267152eface28d9e90a",
"Requirements": [
"magrittr",
"rlang"
]
},
"ragg": {
"Package": "ragg",
"Version": "1.2.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "0db17bd5a1d4abfec76487b6f5dd957b",
"Requirements": [
"systemfonts",
"textshaping"
]
},
"rappdirs": {
"Package": "rappdirs",
"Version": "0.3.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "5e3c5dc0b071b21fa128676560dbe94d",
"Requirements": []
},
"rcmdcheck": {
"Package": "rcmdcheck",
"Version": "1.4.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "8f25ebe2ec38b1f2aef3b0d2ef76f6c4",
"Requirements": [
"R6",
"callr",
"cli",
"curl",
"desc",
"digest",
"pkgbuild",
"prettyunits",
"rprojroot",
"sessioninfo",
"withr",
"xopen"
]
},
"readr": {
"Package": "readr",
"Version": "2.1.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "2dfbfc673ccb3de3d8836b4b3bd23d14",
"Requirements": [
"R6",
"cli",
"clipr",
"cpp11",
"crayon",
"hms",
"lifecycle",
"rlang",
"tibble",
"tzdb",
"vroom"
]
},
"readxl": {
"Package": "readxl",
"Version": "1.4.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "5c1fbc365ac0a3fe7728ac79108b8e64",
"Requirements": [
"cellranger",
"cpp11",
"progress",
"tibble"
]
},
"rematch": {
"Package": "rematch",
"Version": "1.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c66b930d20bb6d858cd18e1cebcfae5c",
"Requirements": []
},
"rematch2": {
"Package": "rematch2",
"Version": "2.1.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "76c9e04c712a05848ae7a23d2f170a40",
"Requirements": [
"tibble"
]
},
"remotes": {
"Package": "remotes",
"Version": "2.4.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "227045be9aee47e6dda9bb38ac870d67",
"Requirements": []
},
"renv": {
"Package": "renv",
"Version": "0.15.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c1078316e1d4f70275fc1ea60c0bc431",
"Requirements": []
},
"reprex": {
"Package": "reprex",
"Version": "2.0.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "d66fe009d4c20b7ab1927eb405db9ee2",
"Requirements": [
"callr",
"cli",
"clipr",
"fs",
"glue",
"knitr",
"lifecycle",
"rlang",
"rmarkdown",
"rstudioapi",
"withr"
]
},
"rlang": {
"Package": "rlang",
"Version": "1.0.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "4ed1f8336c8d52c3e750adcdc57228a7",
"Requirements": []
},
"rmarkdown": {
"Package": "rmarkdown",
"Version": "2.18",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "8063c4e953cefb651e8cd58c82c82d2d",
"Requirements": [
"bslib",
"evaluate",
"htmltools",
"jquerylib",
"jsonlite",
"knitr",
"stringr",
"tinytex",
"xfun",
"yaml"
]
},
"roxygen2": {
"Package": "roxygen2",
"Version": "7.2.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "d0dbb227bab26a4b8af658d81bfb6b36",
"Requirements": [
"R6",
"brew",
"cli",
"commonmark",
"cpp11",
"desc",
"digest",
"knitr",
"pkgload",
"purrr",
"rlang",
"stringi",
"stringr",
"withr",
"xml2"
]
},
"rprojroot": {
"Package": "rprojroot",
"Version": "2.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "1de7ab598047a87bba48434ba35d497d",
"Requirements": []
},
"rstudioapi": {
"Package": "rstudioapi",
"Version": "0.14",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "690bd2acc42a9166ce34845884459320",
"Requirements": []
},
"rversions": {
"Package": "rversions",
"Version": "2.1.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a9881dfed103e83f9de151dc17002cd1",
"Requirements": [
"curl",
"xml2"
]
},
"rvest": {
"Package": "rvest",
"Version": "1.0.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a4a5ac819a467808c60e36e92ddf195e",
"Requirements": [
"cli",
"glue",
"httr",
"lifecycle",
"magrittr",
"rlang",
"selectr",
"tibble",
"withr",
"xml2"
]
},
"sass": {
"Package": "sass",
"Version": "0.4.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c76cbac7ca04ce82d8c38e29729987a3",
"Requirements": [
"R6",
"fs",
"htmltools",
"rappdirs",
"rlang"
]
},
"scales": {
"Package": "scales",
"Version": "1.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "906cb23d2f1c5680b8ce439b44c6fa63",
"Requirements": [
"R6",
"RColorBrewer",
"farver",
"labeling",
"lifecycle",
"munsell",
"rlang",
"viridisLite"
]
},
"selectr": {
"Package": "selectr",
"Version": "0.4-2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "3838071b66e0c566d55cc26bd6e27bf4",
"Requirements": [
"R6",
"stringr"
]
},
"sessioninfo": {
"Package": "sessioninfo",
"Version": "1.2.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "3f9796a8d0a0e8c6eb49a4b029359d1f",
"Requirements": [
"cli"
]
},
"shiny": {
"Package": "shiny",
"Version": "1.7.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "fe12df67fdb3b1142325cc54f100cc06",
"Requirements": [
"R6",
"bslib",
"cachem",
"commonmark",
"crayon",
"ellipsis",
"fastmap",
"fontawesome",
"glue",
"htmltools",
"httpuv",
"jsonlite",
"later",
"lifecycle",
"mime",
"promises",
"rlang",
"sourcetools",
"withr",
"xtable"
]
},
"sodium": {
"Package": "sodium",
"Version": "1.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "3606bb09e0914edd4fc8313b500dcd5e",
"Requirements": []
},
"sourcetools": {
"Package": "sourcetools",
"Version": "0.1.7",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "947e4e02a79effa5d512473e10f41797",
"Requirements": []
},
"stringi": {
"Package": "stringi",
"Version": "1.7.8",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a68b980681bcbc84c7a67003fa796bfb",
"Requirements": []
},
"stringr": {
"Package": "stringr",
"Version": "1.5.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "671a4d384ae9d32fc47a14e98bfa3dc8",
"Requirements": [
"cli",
"glue",
"lifecycle",
"magrittr",
"rlang",
"stringi",
"vctrs"
]
},
"swagger": {
"Package": "swagger",
"Version": "3.33.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f28d25ed70c903922254157c11b0081d",
"Requirements": []
},
"sys": {
"Package": "sys",
"Version": "3.4.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "34c16f1ef796057bfa06d3f4ff818a5d",
"Requirements": []
},
"systemfonts": {
"Package": "systemfonts",
"Version": "1.0.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "90b28393209827327de889f49935140a",
"Requirements": [
"cpp11"
]
},
"testthat": {
"Package": "testthat",
"Version": "3.1.5",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6e3c4843f1ed0d3d90f35498671a001c",
"Requirements": [
"R6",
"brio",
"callr",
"cli",
"desc",
"digest",
"ellipsis",
"evaluate",
"jsonlite",
"lifecycle",
"magrittr",
"pkgload",
"praise",
"processx",
"ps",
"rlang",
"waldo",
"withr"
]
},
"textshaping": {
"Package": "textshaping",
"Version": "0.3.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "1ab6223d3670fac7143202cb6a2d43d5",
"Requirements": [
"cpp11",
"systemfonts"
]
},
"tibble": {
"Package": "tibble",
"Version": "3.1.8",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "56b6934ef0f8c68225949a8672fe1a8f",
"Requirements": [
"fansi",
"lifecycle",
"magrittr",
"pillar",
"pkgconfig",
"rlang",
"vctrs"
]
},
"tidyr": {
"Package": "tidyr",
"Version": "1.2.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "cdb403db0de33ccd1b6f53b83736efa8",
"Requirements": [
"cpp11",
"dplyr",
"ellipsis",
"glue",
"lifecycle",
"magrittr",
"purrr",
"rlang",
"tibble",
"tidyselect",
"vctrs"
]
},
"tidyselect": {
"Package": "tidyselect",
"Version": "1.2.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "79540e5fcd9e0435af547d885f184fd5",
"Requirements": [
"cli",
"glue",
"lifecycle",
"rlang",
"vctrs",
"withr"
]
},
"tidyverse": {
"Package": "tidyverse",
"Version": "1.3.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "972389aea7fa1a34739054a810d0c6f6",
"Requirements": [
"broom",
"cli",
"crayon",
"dbplyr",
"dplyr",
"dtplyr",
"forcats",
"ggplot2",
"googledrive",
"googlesheets4",
"haven",
"hms",
"httr",
"jsonlite",
"lubridate",
"magrittr",
"modelr",
"pillar",
"purrr",
"readr",
"readxl",
"reprex",
"rlang",
"rstudioapi",
"rvest",
"stringr",
"tibble",
"tidyr",
"xml2"
]
},
"timechange": {
"Package": "timechange",
"Version": "0.1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "4657195cc632097bb8d140d626b519fb",
"Requirements": [
"cpp11"
]
},
"tinytex": {
"Package": "tinytex",
"Version": "0.42",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "7629c6c1540835d5248e6e7df265fa74",
"Requirements": [
"xfun"
]
},
"tzdb": {
"Package": "tzdb",
"Version": "0.3.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "b2e1cbce7c903eaf23ec05c58e59fb5e",
"Requirements": [
"cpp11"
]
},
"urlchecker": {
"Package": "urlchecker",
"Version": "1.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "409328b8e1253c8d729a7836fe7f7a16",
"Requirements": [
"cli",
"curl",
"xml2"
]
},
"usethis": {
"Package": "usethis",
"Version": "2.1.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a67a22c201832b12c036cc059f1d137d",
"Requirements": [
"cli",
"clipr",
"crayon",
"curl",
"desc",
"fs",
"gert",
"gh",
"glue",
"jsonlite",
"lifecycle",
"purrr",
"rappdirs",
"rlang",
"rprojroot",
"rstudioapi",
"whisker",
"withr",
"yaml"
]
},
"utf8": {
"Package": "utf8",
"Version": "1.2.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c9c462b759a5cc844ae25b5942654d13",
"Requirements": []
},
"uuid": {
"Package": "uuid",
"Version": "1.1-0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f1cb46c157d080b729159d407be83496",
"Requirements": []
},
"vctrs": {
"Package": "vctrs",
"Version": "0.5.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "970324f6572b4fd81db507b5d4062cb0",
"Requirements": [
"cli",
"glue",
"lifecycle",
"rlang"
]
},
"viridisLite": {
"Package": "viridisLite",
"Version": "0.4.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "62f4b5da3e08d8e5bcba6cac15603f70",
"Requirements": []
},
"vroom": {
"Package": "vroom",
"Version": "1.6.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "64f81fdead6e0d250fb041e175d123ab",
"Requirements": [
"bit64",
"cli",
"cpp11",
"crayon",
"glue",
"hms",
"lifecycle",
"progress",
"rlang",
"tibble",
"tidyselect",
"tzdb",
"vctrs",
"withr"
]
},
"waldo": {
"Package": "waldo",
"Version": "0.4.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "035fba89d0c86e2113120f93301b98ad",
"Requirements": [
"cli",
"diffobj",
"fansi",
"glue",
"rematch2",
"rlang",
"tibble"
]
},
"websocket": {
"Package": "websocket",
"Version": "1.4.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "76e0d400757e318cca33def29ccebbc2",
"Requirements": [
"AsioHeaders",
"R6",
"cpp11",
"later"
]
},
"webutils": {
"Package": "webutils",
"Version": "1.1",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "75d8b5b05fe22659b54076563f83f26a",
"Requirements": [
"curl",
"jsonlite"
]
},
"whisker": {
"Package": "whisker",
"Version": "0.4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "ca970b96d894e90397ed20637a0c1bbe",
"Requirements": []
},
"withr": {
"Package": "withr",
"Version": "2.5.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c0e49a9760983e81e55cdd9be92e7182",
"Requirements": []
},
"xfun": {
"Package": "xfun",
"Version": "0.35",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "f576593107bdf9aa7db48ef75a8c05fb",
"Requirements": []
},
"xml2": {
"Package": "xml2",
"Version": "1.3.3",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "40682ed6a969ea5abfd351eb67833adc",
"Requirements": []
},
"xopen": {
"Package": "xopen",
"Version": "1.0.0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "6c85f015dee9cc7710ddd20f86881f58",
"Requirements": [
"processx"
]
},
"xtable": {
"Package": "xtable",
"Version": "1.8-4",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "b8acdf8af494d9ec19ccb2481a9b11c2",
"Requirements": []
},
"yaml": {
"Package": "yaml",
"Version": "2.3.6",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "9b570515751dcbae610f29885e025b41",
"Requirements": []
},
"zip": {
"Package": "zip",
"Version": "2.2.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "c42bfcec3fa6a0cce17ce1f8bc684f88",
"Requirements": []
}
}
}
@dancingfrog
Copy link
Author

start run-shiny-app.R

@dancingfrog
Copy link
Author

change script name to .exec-shiny-app.R

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment