Last active
September 24, 2024 00:06
-
-
Save dancingfrog/1739ea5bebe1ccaad00f59bedc10e75a to your computer and use it in GitHub Desktop.
.exec-shiny-app.R
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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." | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*.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/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[submodule "shiny-server"] | |
path = shiny-server | |
url = https://github.com/dancingfrog/cori-app-reprex.git |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
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() | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "exec-scripts", | |
"private": true, | |
"version": "0.0.1", | |
"scripts": { | |
"start": "Rscript .exec-shiny-app.R . 5174" | |
}, | |
"devDependencies": { | |
"node-fetch": "^3.3.1" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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": [] | |
} | |
} | |
} |
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
start run-shiny-app.R