vojtam commited on
Commit
09d6110
1 Parent(s): c038271

upload app.R and others

Browse files
Files changed (8) hide show
  1. activate.R +1180 -0
  2. app.R +2 -51
  3. application.Rproj +13 -0
  4. config.yml +3 -0
  5. dependencies.R +2 -0
  6. renv.lock +1002 -0
  7. rhino.yml +1 -0
  8. watch_sass.R +4 -0
activate.R ADDED
@@ -0,0 +1,1180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ local({
3
+
4
+ # the requested version of renv
5
+ version <- "1.0.3"
6
+ attr(version, "sha") <- NULL
7
+
8
+ # the project directory
9
+ project <- getwd()
10
+
11
+ # use start-up diagnostics if enabled
12
+ diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE")
13
+ if (diagnostics) {
14
+ start <- Sys.time()
15
+ profile <- tempfile("renv-startup-", fileext = ".Rprof")
16
+ utils::Rprof(profile)
17
+ on.exit({
18
+ utils::Rprof(NULL)
19
+ elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L)
20
+ writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed)))
21
+ writeLines(sprintf("- Profile: %s", profile))
22
+ print(utils::summaryRprof(profile))
23
+ }, add = TRUE)
24
+ }
25
+
26
+ # figure out whether the autoloader is enabled
27
+ enabled <- local({
28
+
29
+ # first, check config option
30
+ override <- getOption("renv.config.autoloader.enabled")
31
+ if (!is.null(override))
32
+ return(override)
33
+
34
+ # next, check environment variables
35
+ # TODO: prefer using the configuration one in the future
36
+ envvars <- c(
37
+ "RENV_CONFIG_AUTOLOADER_ENABLED",
38
+ "RENV_AUTOLOADER_ENABLED",
39
+ "RENV_ACTIVATE_PROJECT"
40
+ )
41
+
42
+ for (envvar in envvars) {
43
+ envval <- Sys.getenv(envvar, unset = NA)
44
+ if (!is.na(envval))
45
+ return(tolower(envval) %in% c("true", "t", "1"))
46
+ }
47
+
48
+ # enable by default
49
+ TRUE
50
+
51
+ })
52
+
53
+ if (!enabled)
54
+ return(FALSE)
55
+
56
+ # avoid recursion
57
+ if (identical(getOption("renv.autoloader.running"), TRUE)) {
58
+ warning("ignoring recursive attempt to run renv autoloader")
59
+ return(invisible(TRUE))
60
+ }
61
+
62
+ # signal that we're loading renv during R startup
63
+ options(renv.autoloader.running = TRUE)
64
+ on.exit(options(renv.autoloader.running = NULL), add = TRUE)
65
+
66
+ # signal that we've consented to use renv
67
+ options(renv.consent = TRUE)
68
+
69
+ # load the 'utils' package eagerly -- this ensures that renv shims, which
70
+ # mask 'utils' packages, will come first on the search path
71
+ library(utils, lib.loc = .Library)
72
+
73
+ # unload renv if it's already been loaded
74
+ if ("renv" %in% loadedNamespaces())
75
+ unloadNamespace("renv")
76
+
77
+ # load bootstrap tools
78
+ `%||%` <- function(x, y) {
79
+ if (is.null(x)) y else x
80
+ }
81
+
82
+ catf <- function(fmt, ..., appendLF = TRUE) {
83
+
84
+ quiet <- getOption("renv.bootstrap.quiet", default = FALSE)
85
+ if (quiet)
86
+ return(invisible())
87
+
88
+ msg <- sprintf(fmt, ...)
89
+ cat(msg, file = stdout(), sep = if (appendLF) "\n" else "")
90
+
91
+ invisible(msg)
92
+
93
+ }
94
+
95
+ header <- function(label,
96
+ ...,
97
+ prefix = "#",
98
+ suffix = "-",
99
+ n = min(getOption("width"), 78))
100
+ {
101
+ label <- sprintf(label, ...)
102
+ n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L)
103
+ if (n <= 0)
104
+ return(paste(prefix, label))
105
+
106
+ tail <- paste(rep.int(suffix, n), collapse = "")
107
+ paste0(prefix, " ", label, " ", tail)
108
+
109
+ }
110
+
111
+ startswith <- function(string, prefix) {
112
+ substring(string, 1, nchar(prefix)) == prefix
113
+ }
114
+
115
+ bootstrap <- function(version, library) {
116
+
117
+ friendly <- renv_bootstrap_version_friendly(version)
118
+ section <- header(sprintf("Bootstrapping renv %s", friendly))
119
+ catf(section)
120
+
121
+ # attempt to download renv
122
+ catf("- Downloading renv ... ", appendLF = FALSE)
123
+ withCallingHandlers(
124
+ tarball <- renv_bootstrap_download(version),
125
+ error = function(err) {
126
+ catf("FAILED")
127
+ stop("failed to download:\n", conditionMessage(err))
128
+ }
129
+ )
130
+ catf("OK")
131
+ on.exit(unlink(tarball), add = TRUE)
132
+
133
+ # now attempt to install
134
+ catf("- Installing renv ... ", appendLF = FALSE)
135
+ withCallingHandlers(
136
+ status <- renv_bootstrap_install(version, tarball, library),
137
+ error = function(err) {
138
+ catf("FAILED")
139
+ stop("failed to install:\n", conditionMessage(err))
140
+ }
141
+ )
142
+ catf("OK")
143
+
144
+ # add empty line to break up bootstrapping from normal output
145
+ catf("")
146
+
147
+ return(invisible())
148
+ }
149
+
150
+ renv_bootstrap_tests_running <- function() {
151
+ getOption("renv.tests.running", default = FALSE)
152
+ }
153
+
154
+ renv_bootstrap_repos <- function() {
155
+
156
+ # get CRAN repository
157
+ cran <- getOption("renv.repos.cran", "https://cloud.r-project.org")
158
+
159
+ # check for repos override
160
+ repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA)
161
+ if (!is.na(repos)) {
162
+
163
+ # check for RSPM; if set, use a fallback repository for renv
164
+ rspm <- Sys.getenv("RSPM", unset = NA)
165
+ if (identical(rspm, repos))
166
+ repos <- c(RSPM = rspm, CRAN = cran)
167
+
168
+ return(repos)
169
+
170
+ }
171
+
172
+ # check for lockfile repositories
173
+ repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity)
174
+ if (!inherits(repos, "error") && length(repos))
175
+ return(repos)
176
+
177
+ # retrieve current repos
178
+ repos <- getOption("repos")
179
+
180
+ # ensure @CRAN@ entries are resolved
181
+ repos[repos == "@CRAN@"] <- cran
182
+
183
+ # add in renv.bootstrap.repos if set
184
+ default <- c(FALLBACK = "https://cloud.r-project.org")
185
+ extra <- getOption("renv.bootstrap.repos", default = default)
186
+ repos <- c(repos, extra)
187
+
188
+ # remove duplicates that might've snuck in
189
+ dupes <- duplicated(repos) | duplicated(names(repos))
190
+ repos[!dupes]
191
+
192
+ }
193
+
194
+ renv_bootstrap_repos_lockfile <- function() {
195
+
196
+ lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock")
197
+ if (!file.exists(lockpath))
198
+ return(NULL)
199
+
200
+ lockfile <- tryCatch(renv_json_read(lockpath), error = identity)
201
+ if (inherits(lockfile, "error")) {
202
+ warning(lockfile)
203
+ return(NULL)
204
+ }
205
+
206
+ repos <- lockfile$R$Repositories
207
+ if (length(repos) == 0)
208
+ return(NULL)
209
+
210
+ keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1))
211
+ vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1))
212
+ names(vals) <- keys
213
+
214
+ return(vals)
215
+
216
+ }
217
+
218
+ renv_bootstrap_download <- function(version) {
219
+
220
+ sha <- attr(version, "sha", exact = TRUE)
221
+
222
+ methods <- if (!is.null(sha)) {
223
+
224
+ # attempting to bootstrap a development version of renv
225
+ c(
226
+ function() renv_bootstrap_download_tarball(sha),
227
+ function() renv_bootstrap_download_github(sha)
228
+ )
229
+
230
+ } else {
231
+
232
+ # attempting to bootstrap a release version of renv
233
+ c(
234
+ function() renv_bootstrap_download_tarball(version),
235
+ function() renv_bootstrap_download_cran_latest(version),
236
+ function() renv_bootstrap_download_cran_archive(version)
237
+ )
238
+
239
+ }
240
+
241
+ for (method in methods) {
242
+ path <- tryCatch(method(), error = identity)
243
+ if (is.character(path) && file.exists(path))
244
+ return(path)
245
+ }
246
+
247
+ stop("All download methods failed")
248
+
249
+ }
250
+
251
+ renv_bootstrap_download_impl <- function(url, destfile) {
252
+
253
+ mode <- "wb"
254
+
255
+ # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715
256
+ fixup <-
257
+ Sys.info()[["sysname"]] == "Windows" &&
258
+ substring(url, 1L, 5L) == "file:"
259
+
260
+ if (fixup)
261
+ mode <- "w+b"
262
+
263
+ args <- list(
264
+ url = url,
265
+ destfile = destfile,
266
+ mode = mode,
267
+ quiet = TRUE
268
+ )
269
+
270
+ if ("headers" %in% names(formals(utils::download.file)))
271
+ args$headers <- renv_bootstrap_download_custom_headers(url)
272
+
273
+ do.call(utils::download.file, args)
274
+
275
+ }
276
+
277
+ renv_bootstrap_download_custom_headers <- function(url) {
278
+
279
+ headers <- getOption("renv.download.headers")
280
+ if (is.null(headers))
281
+ return(character())
282
+
283
+ if (!is.function(headers))
284
+ stopf("'renv.download.headers' is not a function")
285
+
286
+ headers <- headers(url)
287
+ if (length(headers) == 0L)
288
+ return(character())
289
+
290
+ if (is.list(headers))
291
+ headers <- unlist(headers, recursive = FALSE, use.names = TRUE)
292
+
293
+ ok <-
294
+ is.character(headers) &&
295
+ is.character(names(headers)) &&
296
+ all(nzchar(names(headers)))
297
+
298
+ if (!ok)
299
+ stop("invocation of 'renv.download.headers' did not return a named character vector")
300
+
301
+ headers
302
+
303
+ }
304
+
305
+ renv_bootstrap_download_cran_latest <- function(version) {
306
+
307
+ spec <- renv_bootstrap_download_cran_latest_find(version)
308
+ type <- spec$type
309
+ repos <- spec$repos
310
+
311
+ baseurl <- utils::contrib.url(repos = repos, type = type)
312
+ ext <- if (identical(type, "source"))
313
+ ".tar.gz"
314
+ else if (Sys.info()[["sysname"]] == "Windows")
315
+ ".zip"
316
+ else
317
+ ".tgz"
318
+ name <- sprintf("renv_%s%s", version, ext)
319
+ url <- paste(baseurl, name, sep = "/")
320
+
321
+ destfile <- file.path(tempdir(), name)
322
+ status <- tryCatch(
323
+ renv_bootstrap_download_impl(url, destfile),
324
+ condition = identity
325
+ )
326
+
327
+ if (inherits(status, "condition"))
328
+ return(FALSE)
329
+
330
+ # report success and return
331
+ destfile
332
+
333
+ }
334
+
335
+ renv_bootstrap_download_cran_latest_find <- function(version) {
336
+
337
+ # check whether binaries are supported on this system
338
+ binary <-
339
+ getOption("renv.bootstrap.binary", default = TRUE) &&
340
+ !identical(.Platform$pkgType, "source") &&
341
+ !identical(getOption("pkgType"), "source") &&
342
+ Sys.info()[["sysname"]] %in% c("Darwin", "Windows")
343
+
344
+ types <- c(if (binary) "binary", "source")
345
+
346
+ # iterate over types + repositories
347
+ for (type in types) {
348
+ for (repos in renv_bootstrap_repos()) {
349
+
350
+ # retrieve package database
351
+ db <- tryCatch(
352
+ as.data.frame(
353
+ utils::available.packages(type = type, repos = repos),
354
+ stringsAsFactors = FALSE
355
+ ),
356
+ error = identity
357
+ )
358
+
359
+ if (inherits(db, "error"))
360
+ next
361
+
362
+ # check for compatible entry
363
+ entry <- db[db$Package %in% "renv" & db$Version %in% version, ]
364
+ if (nrow(entry) == 0)
365
+ next
366
+
367
+ # found it; return spec to caller
368
+ spec <- list(entry = entry, type = type, repos = repos)
369
+ return(spec)
370
+
371
+ }
372
+ }
373
+
374
+ # if we got here, we failed to find renv
375
+ fmt <- "renv %s is not available from your declared package repositories"
376
+ stop(sprintf(fmt, version))
377
+
378
+ }
379
+
380
+ renv_bootstrap_download_cran_archive <- function(version) {
381
+
382
+ name <- sprintf("renv_%s.tar.gz", version)
383
+ repos <- renv_bootstrap_repos()
384
+ urls <- file.path(repos, "src/contrib/Archive/renv", name)
385
+ destfile <- file.path(tempdir(), name)
386
+
387
+ for (url in urls) {
388
+
389
+ status <- tryCatch(
390
+ renv_bootstrap_download_impl(url, destfile),
391
+ condition = identity
392
+ )
393
+
394
+ if (identical(status, 0L))
395
+ return(destfile)
396
+
397
+ }
398
+
399
+ return(FALSE)
400
+
401
+ }
402
+
403
+ renv_bootstrap_download_tarball <- function(version) {
404
+
405
+ # if the user has provided the path to a tarball via
406
+ # an environment variable, then use it
407
+ tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA)
408
+ if (is.na(tarball))
409
+ return()
410
+
411
+ # allow directories
412
+ if (dir.exists(tarball)) {
413
+ name <- sprintf("renv_%s.tar.gz", version)
414
+ tarball <- file.path(tarball, name)
415
+ }
416
+
417
+ # bail if it doesn't exist
418
+ if (!file.exists(tarball)) {
419
+
420
+ # let the user know we weren't able to honour their request
421
+ fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist."
422
+ msg <- sprintf(fmt, tarball)
423
+ warning(msg)
424
+
425
+ # bail
426
+ return()
427
+
428
+ }
429
+
430
+ catf("- Using local tarball '%s'.", tarball)
431
+ tarball
432
+
433
+ }
434
+
435
+ renv_bootstrap_download_github <- function(version) {
436
+
437
+ enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE")
438
+ if (!identical(enabled, "TRUE"))
439
+ return(FALSE)
440
+
441
+ # prepare download options
442
+ pat <- Sys.getenv("GITHUB_PAT")
443
+ if (nzchar(Sys.which("curl")) && nzchar(pat)) {
444
+ fmt <- "--location --fail --header \"Authorization: token %s\""
445
+ extra <- sprintf(fmt, pat)
446
+ saved <- options("download.file.method", "download.file.extra")
447
+ options(download.file.method = "curl", download.file.extra = extra)
448
+ on.exit(do.call(base::options, saved), add = TRUE)
449
+ } else if (nzchar(Sys.which("wget")) && nzchar(pat)) {
450
+ fmt <- "--header=\"Authorization: token %s\""
451
+ extra <- sprintf(fmt, pat)
452
+ saved <- options("download.file.method", "download.file.extra")
453
+ options(download.file.method = "wget", download.file.extra = extra)
454
+ on.exit(do.call(base::options, saved), add = TRUE)
455
+ }
456
+
457
+ url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version)
458
+ name <- sprintf("renv_%s.tar.gz", version)
459
+ destfile <- file.path(tempdir(), name)
460
+
461
+ status <- tryCatch(
462
+ renv_bootstrap_download_impl(url, destfile),
463
+ condition = identity
464
+ )
465
+
466
+ if (!identical(status, 0L))
467
+ return(FALSE)
468
+
469
+ renv_bootstrap_download_augment(destfile)
470
+
471
+ return(destfile)
472
+
473
+ }
474
+
475
+ # Add Sha to DESCRIPTION. This is stop gap until #890, after which we
476
+ # can use renv::install() to fully capture metadata.
477
+ renv_bootstrap_download_augment <- function(destfile) {
478
+ sha <- renv_bootstrap_git_extract_sha1_tar(destfile)
479
+ if (is.null(sha)) {
480
+ return()
481
+ }
482
+
483
+ # Untar
484
+ tempdir <- tempfile("renv-github-")
485
+ on.exit(unlink(tempdir, recursive = TRUE), add = TRUE)
486
+ untar(destfile, exdir = tempdir)
487
+ pkgdir <- dir(tempdir, full.names = TRUE)[[1]]
488
+
489
+ # Modify description
490
+ desc_path <- file.path(pkgdir, "DESCRIPTION")
491
+ desc_lines <- readLines(desc_path)
492
+ remotes_fields <- c(
493
+ "RemoteType: github",
494
+ "RemoteHost: api.github.com",
495
+ "RemoteRepo: renv",
496
+ "RemoteUsername: rstudio",
497
+ "RemotePkgRef: rstudio/renv",
498
+ paste("RemoteRef: ", sha),
499
+ paste("RemoteSha: ", sha)
500
+ )
501
+ writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path)
502
+
503
+ # Re-tar
504
+ local({
505
+ old <- setwd(tempdir)
506
+ on.exit(setwd(old), add = TRUE)
507
+
508
+ tar(destfile, compression = "gzip")
509
+ })
510
+ invisible()
511
+ }
512
+
513
+ # Extract the commit hash from a git archive. Git archives include the SHA1
514
+ # hash as the comment field of the tarball pax extended header
515
+ # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html)
516
+ # For GitHub archives this should be the first header after the default one
517
+ # (512 byte) header.
518
+ renv_bootstrap_git_extract_sha1_tar <- function(bundle) {
519
+
520
+ # open the bundle for reading
521
+ # We use gzcon for everything because (from ?gzcon)
522
+ # > Reading from a connection which does not supply a 'gzip' magic
523
+ # > header is equivalent to reading from the original connection
524
+ conn <- gzcon(file(bundle, open = "rb", raw = TRUE))
525
+ on.exit(close(conn))
526
+
527
+ # The default pax header is 512 bytes long and the first pax extended header
528
+ # with the comment should be 51 bytes long
529
+ # `52 comment=` (11 chars) + 40 byte SHA1 hash
530
+ len <- 0x200 + 0x33
531
+ res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len])
532
+
533
+ if (grepl("^52 comment=", res)) {
534
+ sub("52 comment=", "", res)
535
+ } else {
536
+ NULL
537
+ }
538
+ }
539
+
540
+ renv_bootstrap_install <- function(version, tarball, library) {
541
+
542
+ # attempt to install it into project library
543
+ dir.create(library, showWarnings = FALSE, recursive = TRUE)
544
+ output <- renv_bootstrap_install_impl(library, tarball)
545
+
546
+ # check for successful install
547
+ status <- attr(output, "status")
548
+ if (is.null(status) || identical(status, 0L))
549
+ return(status)
550
+
551
+ # an error occurred; report it
552
+ header <- "installation of renv failed"
553
+ lines <- paste(rep.int("=", nchar(header)), collapse = "")
554
+ text <- paste(c(header, lines, output), collapse = "\n")
555
+ stop(text)
556
+
557
+ }
558
+
559
+ renv_bootstrap_install_impl <- function(library, tarball) {
560
+
561
+ # invoke using system2 so we can capture and report output
562
+ bin <- R.home("bin")
563
+ exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R"
564
+ R <- file.path(bin, exe)
565
+
566
+ args <- c(
567
+ "--vanilla", "CMD", "INSTALL", "--no-multiarch",
568
+ "-l", shQuote(path.expand(library)),
569
+ shQuote(path.expand(tarball))
570
+ )
571
+
572
+ system2(R, args, stdout = TRUE, stderr = TRUE)
573
+
574
+ }
575
+
576
+ renv_bootstrap_platform_prefix <- function() {
577
+
578
+ # construct version prefix
579
+ version <- paste(R.version$major, R.version$minor, sep = ".")
580
+ prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-")
581
+
582
+ # include SVN revision for development versions of R
583
+ # (to avoid sharing platform-specific artefacts with released versions of R)
584
+ devel <-
585
+ identical(R.version[["status"]], "Under development (unstable)") ||
586
+ identical(R.version[["nickname"]], "Unsuffered Consequences")
587
+
588
+ if (devel)
589
+ prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r")
590
+
591
+ # build list of path components
592
+ components <- c(prefix, R.version$platform)
593
+
594
+ # include prefix if provided by user
595
+ prefix <- renv_bootstrap_platform_prefix_impl()
596
+ if (!is.na(prefix) && nzchar(prefix))
597
+ components <- c(prefix, components)
598
+
599
+ # build prefix
600
+ paste(components, collapse = "/")
601
+
602
+ }
603
+
604
+ renv_bootstrap_platform_prefix_impl <- function() {
605
+
606
+ # if an explicit prefix has been supplied, use it
607
+ prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA)
608
+ if (!is.na(prefix))
609
+ return(prefix)
610
+
611
+ # if the user has requested an automatic prefix, generate it
612
+ auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA)
613
+ if (auto %in% c("TRUE", "True", "true", "1"))
614
+ return(renv_bootstrap_platform_prefix_auto())
615
+
616
+ # empty string on failure
617
+ ""
618
+
619
+ }
620
+
621
+ renv_bootstrap_platform_prefix_auto <- function() {
622
+
623
+ prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity)
624
+ if (inherits(prefix, "error") || prefix %in% "unknown") {
625
+
626
+ msg <- paste(
627
+ "failed to infer current operating system",
628
+ "please file a bug report at https://github.com/rstudio/renv/issues",
629
+ sep = "; "
630
+ )
631
+
632
+ warning(msg)
633
+
634
+ }
635
+
636
+ prefix
637
+
638
+ }
639
+
640
+ renv_bootstrap_platform_os <- function() {
641
+
642
+ sysinfo <- Sys.info()
643
+ sysname <- sysinfo[["sysname"]]
644
+
645
+ # handle Windows + macOS up front
646
+ if (sysname == "Windows")
647
+ return("windows")
648
+ else if (sysname == "Darwin")
649
+ return("macos")
650
+
651
+ # check for os-release files
652
+ for (file in c("/etc/os-release", "/usr/lib/os-release"))
653
+ if (file.exists(file))
654
+ return(renv_bootstrap_platform_os_via_os_release(file, sysinfo))
655
+
656
+ # check for redhat-release files
657
+ if (file.exists("/etc/redhat-release"))
658
+ return(renv_bootstrap_platform_os_via_redhat_release())
659
+
660
+ "unknown"
661
+
662
+ }
663
+
664
+ renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) {
665
+
666
+ # read /etc/os-release
667
+ release <- utils::read.table(
668
+ file = file,
669
+ sep = "=",
670
+ quote = c("\"", "'"),
671
+ col.names = c("Key", "Value"),
672
+ comment.char = "#",
673
+ stringsAsFactors = FALSE
674
+ )
675
+
676
+ vars <- as.list(release$Value)
677
+ names(vars) <- release$Key
678
+
679
+ # get os name
680
+ os <- tolower(sysinfo[["sysname"]])
681
+
682
+ # read id
683
+ id <- "unknown"
684
+ for (field in c("ID", "ID_LIKE")) {
685
+ if (field %in% names(vars) && nzchar(vars[[field]])) {
686
+ id <- vars[[field]]
687
+ break
688
+ }
689
+ }
690
+
691
+ # read version
692
+ version <- "unknown"
693
+ for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) {
694
+ if (field %in% names(vars) && nzchar(vars[[field]])) {
695
+ version <- vars[[field]]
696
+ break
697
+ }
698
+ }
699
+
700
+ # join together
701
+ paste(c(os, id, version), collapse = "-")
702
+
703
+ }
704
+
705
+ renv_bootstrap_platform_os_via_redhat_release <- function() {
706
+
707
+ # read /etc/redhat-release
708
+ contents <- readLines("/etc/redhat-release", warn = FALSE)
709
+
710
+ # infer id
711
+ id <- if (grepl("centos", contents, ignore.case = TRUE))
712
+ "centos"
713
+ else if (grepl("redhat", contents, ignore.case = TRUE))
714
+ "redhat"
715
+ else
716
+ "unknown"
717
+
718
+ # try to find a version component (very hacky)
719
+ version <- "unknown"
720
+
721
+ parts <- strsplit(contents, "[[:space:]]")[[1L]]
722
+ for (part in parts) {
723
+
724
+ nv <- tryCatch(numeric_version(part), error = identity)
725
+ if (inherits(nv, "error"))
726
+ next
727
+
728
+ version <- nv[1, 1]
729
+ break
730
+
731
+ }
732
+
733
+ paste(c("linux", id, version), collapse = "-")
734
+
735
+ }
736
+
737
+ renv_bootstrap_library_root_name <- function(project) {
738
+
739
+ # use project name as-is if requested
740
+ asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE")
741
+ if (asis)
742
+ return(basename(project))
743
+
744
+ # otherwise, disambiguate based on project's path
745
+ id <- substring(renv_bootstrap_hash_text(project), 1L, 8L)
746
+ paste(basename(project), id, sep = "-")
747
+
748
+ }
749
+
750
+ renv_bootstrap_library_root <- function(project) {
751
+
752
+ prefix <- renv_bootstrap_profile_prefix()
753
+
754
+ path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA)
755
+ if (!is.na(path))
756
+ return(paste(c(path, prefix), collapse = "/"))
757
+
758
+ path <- renv_bootstrap_library_root_impl(project)
759
+ if (!is.null(path)) {
760
+ name <- renv_bootstrap_library_root_name(project)
761
+ return(paste(c(path, prefix, name), collapse = "/"))
762
+ }
763
+
764
+ renv_bootstrap_paths_renv("library", project = project)
765
+
766
+ }
767
+
768
+ renv_bootstrap_library_root_impl <- function(project) {
769
+
770
+ root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA)
771
+ if (!is.na(root))
772
+ return(root)
773
+
774
+ type <- renv_bootstrap_project_type(project)
775
+ if (identical(type, "package")) {
776
+ userdir <- renv_bootstrap_user_dir()
777
+ return(file.path(userdir, "library"))
778
+ }
779
+
780
+ }
781
+
782
+ renv_bootstrap_validate_version <- function(version, description = NULL) {
783
+
784
+ # resolve description file
785
+ #
786
+ # avoid passing lib.loc to `packageDescription()` below, since R will
787
+ # use the loaded version of the package by default anyhow. note that
788
+ # this function should only be called after 'renv' is loaded
789
+ # https://github.com/rstudio/renv/issues/1625
790
+ description <- description %||% packageDescription("renv")
791
+
792
+ # check whether requested version 'version' matches loaded version of renv
793
+ sha <- attr(version, "sha", exact = TRUE)
794
+ valid <- if (!is.null(sha))
795
+ renv_bootstrap_validate_version_dev(sha, description)
796
+ else
797
+ renv_bootstrap_validate_version_release(version, description)
798
+
799
+ if (valid)
800
+ return(TRUE)
801
+
802
+ # the loaded version of renv doesn't match the requested version;
803
+ # give the user instructions on how to proceed
804
+ remote <- if (!is.null(description[["RemoteSha"]])) {
805
+ paste("rstudio/renv", description[["RemoteSha"]], sep = "@")
806
+ } else {
807
+ paste("renv", description[["Version"]], sep = "@")
808
+ }
809
+
810
+ # display both loaded version + sha if available
811
+ friendly <- renv_bootstrap_version_friendly(
812
+ version = description[["Version"]],
813
+ sha = description[["RemoteSha"]]
814
+ )
815
+
816
+ fmt <- paste(
817
+ "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.",
818
+ "- Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.",
819
+ "- Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.",
820
+ sep = "\n"
821
+ )
822
+ catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote)
823
+
824
+ FALSE
825
+
826
+ }
827
+
828
+ renv_bootstrap_validate_version_dev <- function(version, description) {
829
+ expected <- description[["RemoteSha"]]
830
+ is.character(expected) && startswith(expected, version)
831
+ }
832
+
833
+ renv_bootstrap_validate_version_release <- function(version, description) {
834
+ expected <- description[["Version"]]
835
+ is.character(expected) && identical(expected, version)
836
+ }
837
+
838
+ renv_bootstrap_hash_text <- function(text) {
839
+
840
+ hashfile <- tempfile("renv-hash-")
841
+ on.exit(unlink(hashfile), add = TRUE)
842
+
843
+ writeLines(text, con = hashfile)
844
+ tools::md5sum(hashfile)
845
+
846
+ }
847
+
848
+ renv_bootstrap_load <- function(project, libpath, version) {
849
+
850
+ # try to load renv from the project library
851
+ if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE))
852
+ return(FALSE)
853
+
854
+ # warn if the version of renv loaded does not match
855
+ renv_bootstrap_validate_version(version)
856
+
857
+ # execute renv load hooks, if any
858
+ hooks <- getHook("renv::autoload")
859
+ for (hook in hooks)
860
+ if (is.function(hook))
861
+ tryCatch(hook(), error = warnify)
862
+
863
+ # load the project
864
+ renv::load(project)
865
+
866
+ TRUE
867
+
868
+ }
869
+
870
+ renv_bootstrap_profile_load <- function(project) {
871
+
872
+ # if RENV_PROFILE is already set, just use that
873
+ profile <- Sys.getenv("RENV_PROFILE", unset = NA)
874
+ if (!is.na(profile) && nzchar(profile))
875
+ return(profile)
876
+
877
+ # check for a profile file (nothing to do if it doesn't exist)
878
+ path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project)
879
+ if (!file.exists(path))
880
+ return(NULL)
881
+
882
+ # read the profile, and set it if it exists
883
+ contents <- readLines(path, warn = FALSE)
884
+ if (length(contents) == 0L)
885
+ return(NULL)
886
+
887
+ # set RENV_PROFILE
888
+ profile <- contents[[1L]]
889
+ if (!profile %in% c("", "default"))
890
+ Sys.setenv(RENV_PROFILE = profile)
891
+
892
+ profile
893
+
894
+ }
895
+
896
+ renv_bootstrap_profile_prefix <- function() {
897
+ profile <- renv_bootstrap_profile_get()
898
+ if (!is.null(profile))
899
+ return(file.path("profiles", profile, "renv"))
900
+ }
901
+
902
+ renv_bootstrap_profile_get <- function() {
903
+ profile <- Sys.getenv("RENV_PROFILE", unset = "")
904
+ renv_bootstrap_profile_normalize(profile)
905
+ }
906
+
907
+ renv_bootstrap_profile_set <- function(profile) {
908
+ profile <- renv_bootstrap_profile_normalize(profile)
909
+ if (is.null(profile))
910
+ Sys.unsetenv("RENV_PROFILE")
911
+ else
912
+ Sys.setenv(RENV_PROFILE = profile)
913
+ }
914
+
915
+ renv_bootstrap_profile_normalize <- function(profile) {
916
+
917
+ if (is.null(profile) || profile %in% c("", "default"))
918
+ return(NULL)
919
+
920
+ profile
921
+
922
+ }
923
+
924
+ renv_bootstrap_path_absolute <- function(path) {
925
+
926
+ substr(path, 1L, 1L) %in% c("~", "/", "\\") || (
927
+ substr(path, 1L, 1L) %in% c(letters, LETTERS) &&
928
+ substr(path, 2L, 3L) %in% c(":/", ":\\")
929
+ )
930
+
931
+ }
932
+
933
+ renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) {
934
+ renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv")
935
+ root <- if (renv_bootstrap_path_absolute(renv)) NULL else project
936
+ prefix <- if (profile) renv_bootstrap_profile_prefix()
937
+ components <- c(root, renv, prefix, ...)
938
+ paste(components, collapse = "/")
939
+ }
940
+
941
+ renv_bootstrap_project_type <- function(path) {
942
+
943
+ descpath <- file.path(path, "DESCRIPTION")
944
+ if (!file.exists(descpath))
945
+ return("unknown")
946
+
947
+ desc <- tryCatch(
948
+ read.dcf(descpath, all = TRUE),
949
+ error = identity
950
+ )
951
+
952
+ if (inherits(desc, "error"))
953
+ return("unknown")
954
+
955
+ type <- desc$Type
956
+ if (!is.null(type))
957
+ return(tolower(type))
958
+
959
+ package <- desc$Package
960
+ if (!is.null(package))
961
+ return("package")
962
+
963
+ "unknown"
964
+
965
+ }
966
+
967
+ renv_bootstrap_user_dir <- function() {
968
+ dir <- renv_bootstrap_user_dir_impl()
969
+ path.expand(chartr("\\", "/", dir))
970
+ }
971
+
972
+ renv_bootstrap_user_dir_impl <- function() {
973
+
974
+ # use local override if set
975
+ override <- getOption("renv.userdir.override")
976
+ if (!is.null(override))
977
+ return(override)
978
+
979
+ # use R_user_dir if available
980
+ tools <- asNamespace("tools")
981
+ if (is.function(tools$R_user_dir))
982
+ return(tools$R_user_dir("renv", "cache"))
983
+
984
+ # try using our own backfill for older versions of R
985
+ envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME")
986
+ for (envvar in envvars) {
987
+ root <- Sys.getenv(envvar, unset = NA)
988
+ if (!is.na(root))
989
+ return(file.path(root, "R/renv"))
990
+ }
991
+
992
+ # use platform-specific default fallbacks
993
+ if (Sys.info()[["sysname"]] == "Windows")
994
+ file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv")
995
+ else if (Sys.info()[["sysname"]] == "Darwin")
996
+ "~/Library/Caches/org.R-project.R/R/renv"
997
+ else
998
+ "~/.cache/R/renv"
999
+
1000
+ }
1001
+
1002
+ renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) {
1003
+ sha <- sha %||% attr(version, "sha", exact = TRUE)
1004
+ parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L)))
1005
+ paste(parts, collapse = "")
1006
+ }
1007
+
1008
+ renv_bootstrap_exec <- function(project, libpath, version) {
1009
+ if (!renv_bootstrap_load(project, libpath, version))
1010
+ renv_bootstrap_run(version, libpath)
1011
+ }
1012
+
1013
+ renv_bootstrap_run <- function(version, libpath) {
1014
+
1015
+ # perform bootstrap
1016
+ bootstrap(version, libpath)
1017
+
1018
+ # exit early if we're just testing bootstrap
1019
+ if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA)))
1020
+ return(TRUE)
1021
+
1022
+ # try again to load
1023
+ if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) {
1024
+ return(renv::load(project = getwd()))
1025
+ }
1026
+
1027
+ # failed to download or load renv; warn the user
1028
+ msg <- c(
1029
+ "Failed to find an renv installation: the project will not be loaded.",
1030
+ "Use `renv::activate()` to re-initialize the project."
1031
+ )
1032
+
1033
+ warning(paste(msg, collapse = "\n"), call. = FALSE)
1034
+
1035
+ }
1036
+
1037
+ renv_json_read <- function(file = NULL, text = NULL) {
1038
+
1039
+ jlerr <- NULL
1040
+
1041
+ # if jsonlite is loaded, use that instead
1042
+ if ("jsonlite" %in% loadedNamespaces()) {
1043
+
1044
+ json <- catch(renv_json_read_jsonlite(file, text))
1045
+ if (!inherits(json, "error"))
1046
+ return(json)
1047
+
1048
+ jlerr <- json
1049
+
1050
+ }
1051
+
1052
+ # otherwise, fall back to the default JSON reader
1053
+ json <- catch(renv_json_read_default(file, text))
1054
+ if (!inherits(json, "error"))
1055
+ return(json)
1056
+
1057
+ # report an error
1058
+ if (!is.null(jlerr))
1059
+ stop(jlerr)
1060
+ else
1061
+ stop(json)
1062
+
1063
+ }
1064
+
1065
+ renv_json_read_jsonlite <- function(file = NULL, text = NULL) {
1066
+ text <- paste(text %||% read(file), collapse = "\n")
1067
+ jsonlite::fromJSON(txt = text, simplifyVector = FALSE)
1068
+ }
1069
+
1070
+ renv_json_read_default <- function(file = NULL, text = NULL) {
1071
+
1072
+ # find strings in the JSON
1073
+ text <- paste(text %||% read(file), collapse = "\n")
1074
+ pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
1075
+ locs <- gregexpr(pattern, text, perl = TRUE)[[1]]
1076
+
1077
+ # if any are found, replace them with placeholders
1078
+ replaced <- text
1079
+ strings <- character()
1080
+ replacements <- character()
1081
+
1082
+ if (!identical(c(locs), -1L)) {
1083
+
1084
+ # get the string values
1085
+ starts <- locs
1086
+ ends <- locs + attr(locs, "match.length") - 1L
1087
+ strings <- substring(text, starts, ends)
1088
+
1089
+ # only keep those requiring escaping
1090
+ strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE)
1091
+
1092
+ # compute replacements
1093
+ replacements <- sprintf('"\032%i\032"', seq_along(strings))
1094
+
1095
+ # replace the strings
1096
+ mapply(function(string, replacement) {
1097
+ replaced <<- sub(string, replacement, replaced, fixed = TRUE)
1098
+ }, strings, replacements)
1099
+
1100
+ }
1101
+
1102
+ # transform the JSON into something the R parser understands
1103
+ transformed <- replaced
1104
+ transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE)
1105
+ transformed <- gsub("[[{]", "list(", transformed, perl = TRUE)
1106
+ transformed <- gsub("[]}]", ")", transformed, perl = TRUE)
1107
+ transformed <- gsub(":", "=", transformed, fixed = TRUE)
1108
+ text <- paste(transformed, collapse = "\n")
1109
+
1110
+ # parse it
1111
+ json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]]
1112
+
1113
+ # construct map between source strings, replaced strings
1114
+ map <- as.character(parse(text = strings))
1115
+ names(map) <- as.character(parse(text = replacements))
1116
+
1117
+ # convert to list
1118
+ map <- as.list(map)
1119
+
1120
+ # remap strings in object
1121
+ remapped <- renv_json_remap(json, map)
1122
+
1123
+ # evaluate
1124
+ eval(remapped, envir = baseenv())
1125
+
1126
+ }
1127
+
1128
+ renv_json_remap <- function(json, map) {
1129
+
1130
+ # fix names
1131
+ if (!is.null(names(json))) {
1132
+ lhs <- match(names(json), names(map), nomatch = 0L)
1133
+ rhs <- match(names(map), names(json), nomatch = 0L)
1134
+ names(json)[rhs] <- map[lhs]
1135
+ }
1136
+
1137
+ # fix values
1138
+ if (is.character(json))
1139
+ return(map[[json]] %||% json)
1140
+
1141
+ # handle true, false, null
1142
+ if (is.name(json)) {
1143
+ text <- as.character(json)
1144
+ if (text == "true")
1145
+ return(TRUE)
1146
+ else if (text == "false")
1147
+ return(FALSE)
1148
+ else if (text == "null")
1149
+ return(NULL)
1150
+ }
1151
+
1152
+ # recurse
1153
+ if (is.recursive(json)) {
1154
+ for (i in seq_along(json)) {
1155
+ json[i] <- list(renv_json_remap(json[[i]], map))
1156
+ }
1157
+ }
1158
+
1159
+ json
1160
+
1161
+ }
1162
+
1163
+ # load the renv profile, if any
1164
+ renv_bootstrap_profile_load(project)
1165
+
1166
+ # construct path to library root
1167
+ root <- renv_bootstrap_library_root(project)
1168
+
1169
+ # construct library prefix for platform
1170
+ prefix <- renv_bootstrap_platform_prefix()
1171
+
1172
+ # construct full libpath
1173
+ libpath <- file.path(root, prefix)
1174
+
1175
+ # run bootstrap code
1176
+ renv_bootstrap_exec(project, libpath, version)
1177
+
1178
+ invisible()
1179
+
1180
+ })
app.R CHANGED
@@ -1,51 +1,2 @@
1
- library(shiny)
2
- library(bslib)
3
- library(dplyr)
4
- library(ggplot2)
5
-
6
- df <- readr::read_csv("penguins.csv")
7
- # Find subset of columns that are suitable for scatter plot
8
- df_num <- df |> select(where(is.numeric), -Year)
9
-
10
- ui <- page_fillable(theme = bs_theme(bootswatch = "minty"),
11
- layout_sidebar(fillable = TRUE,
12
- sidebar(
13
- varSelectInput("xvar", "X variable", df_num, selected = "Bill Length (mm)"),
14
- varSelectInput("yvar", "Y variable", df_num, selected = "Bill Depth (mm)"),
15
- checkboxGroupInput("species", "Filter by species",
16
- choices = unique(df$Species), selected = unique(df$Species)
17
- ),
18
- hr(), # Add a horizontal rule
19
- checkboxInput("by_species", "Show species", TRUE),
20
- checkboxInput("show_margins", "Show marginal plots", TRUE),
21
- checkboxInput("smooth", "Add smoother"),
22
- ),
23
- plotOutput("scatter")
24
- )
25
- )
26
-
27
- server <- function(input, output, session) {
28
- subsetted <- reactive({
29
- req(input$species)
30
- df |> filter(Species %in% input$species)
31
- })
32
-
33
- output$scatter <- renderPlot({
34
- p <- ggplot(subsetted(), aes(!!input$xvar, !!input$yvar)) + list(
35
- theme(legend.position = "bottom"),
36
- if (input$by_species) aes(color=Species),
37
- geom_point(),
38
- if (input$smooth) geom_smooth()
39
- )
40
-
41
- if (input$show_margins) {
42
- margin_type <- if (input$by_species) "density" else "histogram"
43
- p <- p |> ggExtra::ggMarginal(type = margin_type, margins = "both",
44
- size = 8, groupColour = input$by_species, groupFill = input$by_species)
45
- }
46
-
47
- p
48
- }, res = 100)
49
- }
50
-
51
- shinyApp(ui, server)
 
1
+ # Rhino / shinyApp entrypoint. Do not edit.
2
+ rhino::app()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
application.Rproj ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Version: 1.0
2
+
3
+ RestoreWorkspace: Default
4
+ SaveWorkspace: Default
5
+ AlwaysSaveHistory: Default
6
+
7
+ EnableCodeIndexing: Yes
8
+ UseSpacesForTab: Yes
9
+ NumSpacesForTab: 2
10
+ Encoding: UTF-8
11
+
12
+ RnwWeave: Sweave
13
+ LaTeX: pdfLaTeX
config.yml ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ default:
2
+ rhino_log_level: !expr Sys.getenv("RHINO_LOG_LEVEL", "INFO")
3
+ rhino_log_file: !expr Sys.getenv("RHINO_LOG_FILE", NA)
dependencies.R ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # This file allows packrat (used by rsconnect during deployment) to pick up dependencies.
2
+ library(rhino)
renv.lock ADDED
@@ -0,0 +1,1002 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "R": {
3
+ "Version": "4.3.1",
4
+ "Repositories": [
5
+ {
6
+ "Name": "CRAN",
7
+ "URL": "https://packagemanager.posit.co/cran/latest"
8
+ }
9
+ ]
10
+ },
11
+ "Packages": {
12
+ "R.cache": {
13
+ "Package": "R.cache",
14
+ "Version": "0.16.0",
15
+ "Source": "Repository",
16
+ "Repository": "CRAN",
17
+ "Requirements": [
18
+ "R",
19
+ "R.methodsS3",
20
+ "R.oo",
21
+ "R.utils",
22
+ "digest",
23
+ "utils"
24
+ ],
25
+ "Hash": "fe539ca3f8efb7410c3ae2cf5fe6c0f8"
26
+ },
27
+ "R.methodsS3": {
28
+ "Package": "R.methodsS3",
29
+ "Version": "1.8.2",
30
+ "Source": "Repository",
31
+ "Repository": "CRAN",
32
+ "Requirements": [
33
+ "R",
34
+ "utils"
35
+ ],
36
+ "Hash": "278c286fd6e9e75d0c2e8f731ea445c8"
37
+ },
38
+ "R.oo": {
39
+ "Package": "R.oo",
40
+ "Version": "1.25.0",
41
+ "Source": "Repository",
42
+ "Repository": "CRAN",
43
+ "Requirements": [
44
+ "R",
45
+ "R.methodsS3",
46
+ "methods",
47
+ "utils"
48
+ ],
49
+ "Hash": "a0900a114f4f0194cf4aa8cd4a700681"
50
+ },
51
+ "R.utils": {
52
+ "Package": "R.utils",
53
+ "Version": "2.12.2",
54
+ "Source": "Repository",
55
+ "Repository": "CRAN",
56
+ "Requirements": [
57
+ "R",
58
+ "R.methodsS3",
59
+ "R.oo",
60
+ "methods",
61
+ "tools",
62
+ "utils"
63
+ ],
64
+ "Hash": "325f01db13da12c04d8f6e7be36ff514"
65
+ },
66
+ "R6": {
67
+ "Package": "R6",
68
+ "Version": "2.5.1",
69
+ "Source": "Repository",
70
+ "Repository": "RSPM",
71
+ "Requirements": [
72
+ "R"
73
+ ],
74
+ "Hash": "470851b6d5d0ac559e9d01bb352b4021"
75
+ },
76
+ "Rcpp": {
77
+ "Package": "Rcpp",
78
+ "Version": "1.0.11",
79
+ "Source": "Repository",
80
+ "Repository": "RSPM",
81
+ "Requirements": [
82
+ "methods",
83
+ "utils"
84
+ ],
85
+ "Hash": "ae6cbbe1492f4de79c45fce06f967ce8"
86
+ },
87
+ "backports": {
88
+ "Package": "backports",
89
+ "Version": "1.4.1",
90
+ "Source": "Repository",
91
+ "Repository": "RSPM",
92
+ "Requirements": [
93
+ "R"
94
+ ],
95
+ "Hash": "c39fbec8a30d23e721980b8afb31984c"
96
+ },
97
+ "base64enc": {
98
+ "Package": "base64enc",
99
+ "Version": "0.1-3",
100
+ "Source": "Repository",
101
+ "Repository": "RSPM",
102
+ "Requirements": [
103
+ "R"
104
+ ],
105
+ "Hash": "543776ae6848fde2f48ff3816d0628bc"
106
+ },
107
+ "box": {
108
+ "Package": "box",
109
+ "Version": "1.1.3",
110
+ "Source": "Repository",
111
+ "Repository": "CRAN",
112
+ "Requirements": [
113
+ "R",
114
+ "tools"
115
+ ],
116
+ "Hash": "ce8187a260e8e3abc2294284badc3b76"
117
+ },
118
+ "brio": {
119
+ "Package": "brio",
120
+ "Version": "1.1.3",
121
+ "Source": "Repository",
122
+ "Repository": "RSPM",
123
+ "Hash": "976cf154dfb043c012d87cddd8bca363"
124
+ },
125
+ "bslib": {
126
+ "Package": "bslib",
127
+ "Version": "0.5.1",
128
+ "Source": "Repository",
129
+ "Repository": "RSPM",
130
+ "Requirements": [
131
+ "R",
132
+ "base64enc",
133
+ "cachem",
134
+ "grDevices",
135
+ "htmltools",
136
+ "jquerylib",
137
+ "jsonlite",
138
+ "memoise",
139
+ "mime",
140
+ "rlang",
141
+ "sass"
142
+ ],
143
+ "Hash": "283015ddfbb9d7bf15ea9f0b5698f0d9"
144
+ },
145
+ "cachem": {
146
+ "Package": "cachem",
147
+ "Version": "1.0.8",
148
+ "Source": "Repository",
149
+ "Repository": "RSPM",
150
+ "Requirements": [
151
+ "fastmap",
152
+ "rlang"
153
+ ],
154
+ "Hash": "c35768291560ce302c0a6589f92e837d"
155
+ },
156
+ "callr": {
157
+ "Package": "callr",
158
+ "Version": "3.7.3",
159
+ "Source": "Repository",
160
+ "Repository": "RSPM",
161
+ "Requirements": [
162
+ "R",
163
+ "R6",
164
+ "processx",
165
+ "utils"
166
+ ],
167
+ "Hash": "9b2191ede20fa29828139b9900922e51"
168
+ },
169
+ "cli": {
170
+ "Package": "cli",
171
+ "Version": "3.6.1",
172
+ "Source": "Repository",
173
+ "Repository": "RSPM",
174
+ "Requirements": [
175
+ "R",
176
+ "utils"
177
+ ],
178
+ "Hash": "89e6d8219950eac806ae0c489052048a"
179
+ },
180
+ "codetools": {
181
+ "Package": "codetools",
182
+ "Version": "0.2-19",
183
+ "Source": "Repository",
184
+ "Repository": "CRAN",
185
+ "Requirements": [
186
+ "R"
187
+ ],
188
+ "Hash": "c089a619a7fae175d149d89164f8c7d8"
189
+ },
190
+ "commonmark": {
191
+ "Package": "commonmark",
192
+ "Version": "1.9.0",
193
+ "Source": "Repository",
194
+ "Repository": "RSPM",
195
+ "Hash": "d691c61bff84bd63c383874d2d0c3307"
196
+ },
197
+ "config": {
198
+ "Package": "config",
199
+ "Version": "0.3.2",
200
+ "Source": "Repository",
201
+ "Repository": "RSPM",
202
+ "Requirements": [
203
+ "yaml"
204
+ ],
205
+ "Hash": "8b7222e9d9eb5178eea545c0c4d33fc2"
206
+ },
207
+ "crayon": {
208
+ "Package": "crayon",
209
+ "Version": "1.5.2",
210
+ "Source": "Repository",
211
+ "Repository": "RSPM",
212
+ "Requirements": [
213
+ "grDevices",
214
+ "methods",
215
+ "utils"
216
+ ],
217
+ "Hash": "e8a1e41acf02548751f45c718d55aa6a"
218
+ },
219
+ "cyclocomp": {
220
+ "Package": "cyclocomp",
221
+ "Version": "1.1.1",
222
+ "Source": "Repository",
223
+ "Repository": "CRAN",
224
+ "Requirements": [
225
+ "callr",
226
+ "crayon",
227
+ "desc",
228
+ "remotes",
229
+ "withr"
230
+ ],
231
+ "Hash": "cdc4a473222b0112d4df0bcfbed12d44"
232
+ },
233
+ "desc": {
234
+ "Package": "desc",
235
+ "Version": "1.4.2",
236
+ "Source": "Repository",
237
+ "Repository": "RSPM",
238
+ "Requirements": [
239
+ "R",
240
+ "R6",
241
+ "cli",
242
+ "rprojroot",
243
+ "utils"
244
+ ],
245
+ "Hash": "6b9602c7ebbe87101a9c8edb6e8b6d21"
246
+ },
247
+ "diffobj": {
248
+ "Package": "diffobj",
249
+ "Version": "0.3.5",
250
+ "Source": "Repository",
251
+ "Repository": "RSPM",
252
+ "Requirements": [
253
+ "R",
254
+ "crayon",
255
+ "methods",
256
+ "stats",
257
+ "tools",
258
+ "utils"
259
+ ],
260
+ "Hash": "bcaa8b95f8d7d01a5dedfd959ce88ab8"
261
+ },
262
+ "digest": {
263
+ "Package": "digest",
264
+ "Version": "0.6.33",
265
+ "Source": "Repository",
266
+ "Repository": "RSPM",
267
+ "Requirements": [
268
+ "R",
269
+ "utils"
270
+ ],
271
+ "Hash": "b18a9cf3c003977b0cc49d5e76ebe48d"
272
+ },
273
+ "ellipsis": {
274
+ "Package": "ellipsis",
275
+ "Version": "0.3.2",
276
+ "Source": "Repository",
277
+ "Repository": "RSPM",
278
+ "Requirements": [
279
+ "R",
280
+ "rlang"
281
+ ],
282
+ "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077"
283
+ },
284
+ "evaluate": {
285
+ "Package": "evaluate",
286
+ "Version": "0.22",
287
+ "Source": "Repository",
288
+ "Repository": "RSPM",
289
+ "Requirements": [
290
+ "R",
291
+ "methods"
292
+ ],
293
+ "Hash": "66f39c7a21e03c4dcb2c2d21d738d603"
294
+ },
295
+ "fansi": {
296
+ "Package": "fansi",
297
+ "Version": "1.0.5",
298
+ "Source": "Repository",
299
+ "Repository": "RSPM",
300
+ "Requirements": [
301
+ "R",
302
+ "grDevices",
303
+ "utils"
304
+ ],
305
+ "Hash": "3e8583a60163b4bc1a80016e63b9959e"
306
+ },
307
+ "fastmap": {
308
+ "Package": "fastmap",
309
+ "Version": "1.1.1",
310
+ "Source": "Repository",
311
+ "Repository": "RSPM",
312
+ "Hash": "f7736a18de97dea803bde0a2daaafb27"
313
+ },
314
+ "fontawesome": {
315
+ "Package": "fontawesome",
316
+ "Version": "0.5.2",
317
+ "Source": "Repository",
318
+ "Repository": "RSPM",
319
+ "Requirements": [
320
+ "R",
321
+ "htmltools",
322
+ "rlang"
323
+ ],
324
+ "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d"
325
+ },
326
+ "fs": {
327
+ "Package": "fs",
328
+ "Version": "1.6.3",
329
+ "Source": "Repository",
330
+ "Repository": "RSPM",
331
+ "Requirements": [
332
+ "R",
333
+ "methods"
334
+ ],
335
+ "Hash": "47b5f30c720c23999b913a1a635cf0bb"
336
+ },
337
+ "glue": {
338
+ "Package": "glue",
339
+ "Version": "1.6.2",
340
+ "Source": "Repository",
341
+ "Repository": "RSPM",
342
+ "Requirements": [
343
+ "R",
344
+ "methods"
345
+ ],
346
+ "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e"
347
+ },
348
+ "highr": {
349
+ "Package": "highr",
350
+ "Version": "0.10",
351
+ "Source": "Repository",
352
+ "Repository": "RSPM",
353
+ "Requirements": [
354
+ "R",
355
+ "xfun"
356
+ ],
357
+ "Hash": "06230136b2d2b9ba5805e1963fa6e890"
358
+ },
359
+ "htmltools": {
360
+ "Package": "htmltools",
361
+ "Version": "0.5.6.1",
362
+ "Source": "Repository",
363
+ "Repository": "RSPM",
364
+ "Requirements": [
365
+ "R",
366
+ "base64enc",
367
+ "digest",
368
+ "ellipsis",
369
+ "fastmap",
370
+ "grDevices",
371
+ "rlang",
372
+ "utils"
373
+ ],
374
+ "Hash": "1e12fe667316a76508898839ecfb2d00"
375
+ },
376
+ "httpuv": {
377
+ "Package": "httpuv",
378
+ "Version": "1.6.12",
379
+ "Source": "Repository",
380
+ "Repository": "CRAN",
381
+ "Requirements": [
382
+ "R",
383
+ "R6",
384
+ "Rcpp",
385
+ "later",
386
+ "promises",
387
+ "utils"
388
+ ],
389
+ "Hash": "c992f75861325961c29a188b45e549f7"
390
+ },
391
+ "jquerylib": {
392
+ "Package": "jquerylib",
393
+ "Version": "0.1.4",
394
+ "Source": "Repository",
395
+ "Repository": "RSPM",
396
+ "Requirements": [
397
+ "htmltools"
398
+ ],
399
+ "Hash": "5aab57a3bd297eee1c1d862735972182"
400
+ },
401
+ "jsonlite": {
402
+ "Package": "jsonlite",
403
+ "Version": "1.8.7",
404
+ "Source": "Repository",
405
+ "Repository": "RSPM",
406
+ "Requirements": [
407
+ "methods"
408
+ ],
409
+ "Hash": "266a20443ca13c65688b2116d5220f76"
410
+ },
411
+ "knitr": {
412
+ "Package": "knitr",
413
+ "Version": "1.44",
414
+ "Source": "Repository",
415
+ "Repository": "RSPM",
416
+ "Requirements": [
417
+ "R",
418
+ "evaluate",
419
+ "highr",
420
+ "methods",
421
+ "tools",
422
+ "xfun",
423
+ "yaml"
424
+ ],
425
+ "Hash": "60885b9f746c9dfaef110d070b5f7dc0"
426
+ },
427
+ "later": {
428
+ "Package": "later",
429
+ "Version": "1.3.1",
430
+ "Source": "Repository",
431
+ "Repository": "RSPM",
432
+ "Requirements": [
433
+ "Rcpp",
434
+ "rlang"
435
+ ],
436
+ "Hash": "40401c9cf2bc2259dfe83311c9384710"
437
+ },
438
+ "lazyeval": {
439
+ "Package": "lazyeval",
440
+ "Version": "0.2.2",
441
+ "Source": "Repository",
442
+ "Repository": "RSPM",
443
+ "Requirements": [
444
+ "R"
445
+ ],
446
+ "Hash": "d908914ae53b04d4c0c0fd72ecc35370"
447
+ },
448
+ "lifecycle": {
449
+ "Package": "lifecycle",
450
+ "Version": "1.0.3",
451
+ "Source": "Repository",
452
+ "Repository": "RSPM",
453
+ "Requirements": [
454
+ "R",
455
+ "cli",
456
+ "glue",
457
+ "rlang"
458
+ ],
459
+ "Hash": "001cecbeac1cff9301bdc3775ee46a86"
460
+ },
461
+ "lintr": {
462
+ "Package": "lintr",
463
+ "Version": "3.1.0",
464
+ "Source": "Repository",
465
+ "Repository": "CRAN",
466
+ "Requirements": [
467
+ "R",
468
+ "backports",
469
+ "codetools",
470
+ "cyclocomp",
471
+ "digest",
472
+ "glue",
473
+ "knitr",
474
+ "rex",
475
+ "stats",
476
+ "utils",
477
+ "xml2",
478
+ "xmlparsedata"
479
+ ],
480
+ "Hash": "2b4b803af6017e93b67ddaf0eacba918"
481
+ },
482
+ "logger": {
483
+ "Package": "logger",
484
+ "Version": "0.2.2",
485
+ "Source": "Repository",
486
+ "Repository": "CRAN",
487
+ "Requirements": [
488
+ "utils"
489
+ ],
490
+ "Hash": "c269b06beb2bbadb0d058c0e6fa4ec3d"
491
+ },
492
+ "magrittr": {
493
+ "Package": "magrittr",
494
+ "Version": "2.0.3",
495
+ "Source": "Repository",
496
+ "Repository": "RSPM",
497
+ "Requirements": [
498
+ "R"
499
+ ],
500
+ "Hash": "7ce2733a9826b3aeb1775d56fd305472"
501
+ },
502
+ "memoise": {
503
+ "Package": "memoise",
504
+ "Version": "2.0.1",
505
+ "Source": "Repository",
506
+ "Repository": "RSPM",
507
+ "Requirements": [
508
+ "cachem",
509
+ "rlang"
510
+ ],
511
+ "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c"
512
+ },
513
+ "mime": {
514
+ "Package": "mime",
515
+ "Version": "0.12",
516
+ "Source": "Repository",
517
+ "Repository": "RSPM",
518
+ "Requirements": [
519
+ "tools"
520
+ ],
521
+ "Hash": "18e9c28c1d3ca1560ce30658b22ce104"
522
+ },
523
+ "pillar": {
524
+ "Package": "pillar",
525
+ "Version": "1.9.0",
526
+ "Source": "Repository",
527
+ "Repository": "RSPM",
528
+ "Requirements": [
529
+ "cli",
530
+ "fansi",
531
+ "glue",
532
+ "lifecycle",
533
+ "rlang",
534
+ "utf8",
535
+ "utils",
536
+ "vctrs"
537
+ ],
538
+ "Hash": "15da5a8412f317beeee6175fbc76f4bb"
539
+ },
540
+ "pkgbuild": {
541
+ "Package": "pkgbuild",
542
+ "Version": "1.4.2",
543
+ "Source": "Repository",
544
+ "Repository": "RSPM",
545
+ "Requirements": [
546
+ "R",
547
+ "R6",
548
+ "callr",
549
+ "cli",
550
+ "crayon",
551
+ "desc",
552
+ "prettyunits",
553
+ "processx",
554
+ "rprojroot"
555
+ ],
556
+ "Hash": "beb25b32a957a22a5c301a9e441190b3"
557
+ },
558
+ "pkgconfig": {
559
+ "Package": "pkgconfig",
560
+ "Version": "2.0.3",
561
+ "Source": "Repository",
562
+ "Repository": "RSPM",
563
+ "Requirements": [
564
+ "utils"
565
+ ],
566
+ "Hash": "01f28d4278f15c76cddbea05899c5d6f"
567
+ },
568
+ "pkgload": {
569
+ "Package": "pkgload",
570
+ "Version": "1.3.3",
571
+ "Source": "Repository",
572
+ "Repository": "RSPM",
573
+ "Requirements": [
574
+ "R",
575
+ "cli",
576
+ "crayon",
577
+ "desc",
578
+ "fs",
579
+ "glue",
580
+ "methods",
581
+ "pkgbuild",
582
+ "rlang",
583
+ "rprojroot",
584
+ "utils",
585
+ "withr"
586
+ ],
587
+ "Hash": "903d68319ae9923fb2e2ee7fa8230b91"
588
+ },
589
+ "praise": {
590
+ "Package": "praise",
591
+ "Version": "1.0.0",
592
+ "Source": "Repository",
593
+ "Repository": "RSPM",
594
+ "Hash": "a555924add98c99d2f411e37e7d25e9f"
595
+ },
596
+ "prettyunits": {
597
+ "Package": "prettyunits",
598
+ "Version": "1.2.0",
599
+ "Source": "Repository",
600
+ "Repository": "RSPM",
601
+ "Requirements": [
602
+ "R"
603
+ ],
604
+ "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7"
605
+ },
606
+ "processx": {
607
+ "Package": "processx",
608
+ "Version": "3.8.2",
609
+ "Source": "Repository",
610
+ "Repository": "RSPM",
611
+ "Requirements": [
612
+ "R",
613
+ "R6",
614
+ "ps",
615
+ "utils"
616
+ ],
617
+ "Hash": "3efbd8ac1be0296a46c55387aeace0f3"
618
+ },
619
+ "promises": {
620
+ "Package": "promises",
621
+ "Version": "1.2.1",
622
+ "Source": "Repository",
623
+ "Repository": "RSPM",
624
+ "Requirements": [
625
+ "R6",
626
+ "Rcpp",
627
+ "fastmap",
628
+ "later",
629
+ "magrittr",
630
+ "rlang",
631
+ "stats"
632
+ ],
633
+ "Hash": "0d8a15c9d000970ada1ab21405387dee"
634
+ },
635
+ "ps": {
636
+ "Package": "ps",
637
+ "Version": "1.7.5",
638
+ "Source": "Repository",
639
+ "Repository": "RSPM",
640
+ "Requirements": [
641
+ "R",
642
+ "utils"
643
+ ],
644
+ "Hash": "709d852d33178db54b17c722e5b1e594"
645
+ },
646
+ "purrr": {
647
+ "Package": "purrr",
648
+ "Version": "1.0.2",
649
+ "Source": "Repository",
650
+ "Repository": "RSPM",
651
+ "Requirements": [
652
+ "R",
653
+ "cli",
654
+ "lifecycle",
655
+ "magrittr",
656
+ "rlang",
657
+ "vctrs"
658
+ ],
659
+ "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc"
660
+ },
661
+ "rappdirs": {
662
+ "Package": "rappdirs",
663
+ "Version": "0.3.3",
664
+ "Source": "Repository",
665
+ "Repository": "RSPM",
666
+ "Requirements": [
667
+ "R"
668
+ ],
669
+ "Hash": "5e3c5dc0b071b21fa128676560dbe94d"
670
+ },
671
+ "rematch2": {
672
+ "Package": "rematch2",
673
+ "Version": "2.1.2",
674
+ "Source": "Repository",
675
+ "Repository": "RSPM",
676
+ "Requirements": [
677
+ "tibble"
678
+ ],
679
+ "Hash": "76c9e04c712a05848ae7a23d2f170a40"
680
+ },
681
+ "remotes": {
682
+ "Package": "remotes",
683
+ "Version": "2.4.2.1",
684
+ "Source": "Repository",
685
+ "Repository": "RSPM",
686
+ "Requirements": [
687
+ "R",
688
+ "methods",
689
+ "stats",
690
+ "tools",
691
+ "utils"
692
+ ],
693
+ "Hash": "63d15047eb239f95160112bcadc4fcb9"
694
+ },
695
+ "renv": {
696
+ "Package": "renv",
697
+ "Version": "1.0.3",
698
+ "Source": "Repository",
699
+ "Repository": "CRAN",
700
+ "Requirements": [
701
+ "utils"
702
+ ],
703
+ "Hash": "41b847654f567341725473431dd0d5ab"
704
+ },
705
+ "rex": {
706
+ "Package": "rex",
707
+ "Version": "1.2.1",
708
+ "Source": "Repository",
709
+ "Repository": "CRAN",
710
+ "Requirements": [
711
+ "lazyeval"
712
+ ],
713
+ "Hash": "ae34cd56890607370665bee5bd17812f"
714
+ },
715
+ "rhino": {
716
+ "Package": "rhino",
717
+ "Version": "1.5.0",
718
+ "Source": "Repository",
719
+ "Repository": "CRAN",
720
+ "Requirements": [
721
+ "R",
722
+ "box",
723
+ "cli",
724
+ "config",
725
+ "fs",
726
+ "glue",
727
+ "lintr",
728
+ "logger",
729
+ "purrr",
730
+ "renv",
731
+ "rstudioapi",
732
+ "sass",
733
+ "shiny",
734
+ "styler",
735
+ "testthat",
736
+ "utils",
737
+ "withr",
738
+ "yaml"
739
+ ],
740
+ "Hash": "aec1b2db96151d32a244d38b136d8392"
741
+ },
742
+ "rlang": {
743
+ "Package": "rlang",
744
+ "Version": "1.1.1",
745
+ "Source": "Repository",
746
+ "Repository": "RSPM",
747
+ "Requirements": [
748
+ "R",
749
+ "utils"
750
+ ],
751
+ "Hash": "a85c767b55f0bf9b7ad16c6d7baee5bb"
752
+ },
753
+ "rprojroot": {
754
+ "Package": "rprojroot",
755
+ "Version": "2.0.3",
756
+ "Source": "Repository",
757
+ "Repository": "RSPM",
758
+ "Requirements": [
759
+ "R"
760
+ ],
761
+ "Hash": "1de7ab598047a87bba48434ba35d497d"
762
+ },
763
+ "rstudioapi": {
764
+ "Package": "rstudioapi",
765
+ "Version": "0.15.0",
766
+ "Source": "Repository",
767
+ "Repository": "RSPM",
768
+ "Hash": "5564500e25cffad9e22244ced1379887"
769
+ },
770
+ "sass": {
771
+ "Package": "sass",
772
+ "Version": "0.4.7",
773
+ "Source": "Repository",
774
+ "Repository": "RSPM",
775
+ "Requirements": [
776
+ "R6",
777
+ "fs",
778
+ "htmltools",
779
+ "rappdirs",
780
+ "rlang"
781
+ ],
782
+ "Hash": "6bd4d33b50ff927191ec9acbf52fd056"
783
+ },
784
+ "shiny": {
785
+ "Package": "shiny",
786
+ "Version": "1.7.5.1",
787
+ "Source": "Repository",
788
+ "Repository": "CRAN",
789
+ "Requirements": [
790
+ "R",
791
+ "R6",
792
+ "bslib",
793
+ "cachem",
794
+ "commonmark",
795
+ "crayon",
796
+ "ellipsis",
797
+ "fastmap",
798
+ "fontawesome",
799
+ "glue",
800
+ "grDevices",
801
+ "htmltools",
802
+ "httpuv",
803
+ "jsonlite",
804
+ "later",
805
+ "lifecycle",
806
+ "methods",
807
+ "mime",
808
+ "promises",
809
+ "rlang",
810
+ "sourcetools",
811
+ "tools",
812
+ "utils",
813
+ "withr",
814
+ "xtable"
815
+ ],
816
+ "Hash": "5ec01cc255f2138fc2f0dc74d2b1a1a1"
817
+ },
818
+ "sourcetools": {
819
+ "Package": "sourcetools",
820
+ "Version": "0.1.7-1",
821
+ "Source": "Repository",
822
+ "Repository": "RSPM",
823
+ "Requirements": [
824
+ "R"
825
+ ],
826
+ "Hash": "5f5a7629f956619d519205ec475fe647"
827
+ },
828
+ "styler": {
829
+ "Package": "styler",
830
+ "Version": "1.10.2",
831
+ "Source": "Repository",
832
+ "Repository": "CRAN",
833
+ "Requirements": [
834
+ "R",
835
+ "R.cache",
836
+ "cli",
837
+ "magrittr",
838
+ "purrr",
839
+ "rlang",
840
+ "rprojroot",
841
+ "tools",
842
+ "vctrs",
843
+ "withr"
844
+ ],
845
+ "Hash": "d61238fd44fc63c8adf4565efe8eb682"
846
+ },
847
+ "testthat": {
848
+ "Package": "testthat",
849
+ "Version": "3.2.0",
850
+ "Source": "Repository",
851
+ "Repository": "RSPM",
852
+ "Requirements": [
853
+ "R",
854
+ "R6",
855
+ "brio",
856
+ "callr",
857
+ "cli",
858
+ "desc",
859
+ "digest",
860
+ "ellipsis",
861
+ "evaluate",
862
+ "jsonlite",
863
+ "lifecycle",
864
+ "magrittr",
865
+ "methods",
866
+ "pkgload",
867
+ "praise",
868
+ "processx",
869
+ "ps",
870
+ "rlang",
871
+ "utils",
872
+ "waldo",
873
+ "withr"
874
+ ],
875
+ "Hash": "877508719fcb8c9525eccdadf07a5102"
876
+ },
877
+ "tibble": {
878
+ "Package": "tibble",
879
+ "Version": "3.2.1",
880
+ "Source": "Repository",
881
+ "Repository": "RSPM",
882
+ "Requirements": [
883
+ "R",
884
+ "fansi",
885
+ "lifecycle",
886
+ "magrittr",
887
+ "methods",
888
+ "pillar",
889
+ "pkgconfig",
890
+ "rlang",
891
+ "utils",
892
+ "vctrs"
893
+ ],
894
+ "Hash": "a84e2cc86d07289b3b6f5069df7a004c"
895
+ },
896
+ "utf8": {
897
+ "Package": "utf8",
898
+ "Version": "1.2.4",
899
+ "Source": "Repository",
900
+ "Repository": "CRAN",
901
+ "Requirements": [
902
+ "R"
903
+ ],
904
+ "Hash": "62b65c52671e6665f803ff02954446e9"
905
+ },
906
+ "vctrs": {
907
+ "Package": "vctrs",
908
+ "Version": "0.6.4",
909
+ "Source": "Repository",
910
+ "Repository": "CRAN",
911
+ "Requirements": [
912
+ "R",
913
+ "cli",
914
+ "glue",
915
+ "lifecycle",
916
+ "rlang"
917
+ ],
918
+ "Hash": "266c1ca411266ba8f365fcc726444b87"
919
+ },
920
+ "waldo": {
921
+ "Package": "waldo",
922
+ "Version": "0.5.1",
923
+ "Source": "Repository",
924
+ "Repository": "RSPM",
925
+ "Requirements": [
926
+ "cli",
927
+ "diffobj",
928
+ "fansi",
929
+ "glue",
930
+ "methods",
931
+ "rematch2",
932
+ "rlang",
933
+ "tibble"
934
+ ],
935
+ "Hash": "2c993415154cdb94649d99ae138ff5e5"
936
+ },
937
+ "withr": {
938
+ "Package": "withr",
939
+ "Version": "2.5.1",
940
+ "Source": "Repository",
941
+ "Repository": "RSPM",
942
+ "Requirements": [
943
+ "R",
944
+ "grDevices",
945
+ "graphics",
946
+ "stats"
947
+ ],
948
+ "Hash": "d77c6f74be05c33164e33fbc85540cae"
949
+ },
950
+ "xfun": {
951
+ "Package": "xfun",
952
+ "Version": "0.40",
953
+ "Source": "Repository",
954
+ "Repository": "RSPM",
955
+ "Requirements": [
956
+ "stats",
957
+ "tools"
958
+ ],
959
+ "Hash": "be07d23211245fc7d4209f54c4e4ffc8"
960
+ },
961
+ "xml2": {
962
+ "Package": "xml2",
963
+ "Version": "1.3.5",
964
+ "Source": "Repository",
965
+ "Repository": "RSPM",
966
+ "Requirements": [
967
+ "R",
968
+ "methods"
969
+ ],
970
+ "Hash": "6c40e5cfcc6aefd88110666e18c31f40"
971
+ },
972
+ "xmlparsedata": {
973
+ "Package": "xmlparsedata",
974
+ "Version": "1.0.5",
975
+ "Source": "Repository",
976
+ "Repository": "CRAN",
977
+ "Requirements": [
978
+ "R"
979
+ ],
980
+ "Hash": "45e4bf3c46476896e821fc0a408fb4fc"
981
+ },
982
+ "xtable": {
983
+ "Package": "xtable",
984
+ "Version": "1.8-4",
985
+ "Source": "Repository",
986
+ "Repository": "RSPM",
987
+ "Requirements": [
988
+ "R",
989
+ "stats",
990
+ "utils"
991
+ ],
992
+ "Hash": "b8acdf8af494d9ec19ccb2481a9b11c2"
993
+ },
994
+ "yaml": {
995
+ "Package": "yaml",
996
+ "Version": "2.3.7",
997
+ "Source": "Repository",
998
+ "Repository": "RSPM",
999
+ "Hash": "0d0056cc5383fbc240ccd0cb584bf436"
1000
+ }
1001
+ }
1002
+ }
rhino.yml ADDED
@@ -0,0 +1 @@
 
 
1
+ sass: node
watch_sass.R ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ # Rebuild sass every time a change occurs
2
+ # run this in a separate process
3
+
4
+ rhino::build_sass(watch = TRUE)