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": [] | |
| } | |
| } | |
| } |
Author
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
start run-shiny-app.R