appsilon-open-source commited on
Commit
a2b91d8
1 Parent(s): 112fa67

Basic Rhino application.

Browse files
.Rprofile ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ if (file.exists("renv")) {
2
+ source("renv/activate.R")
3
+ } else {
4
+ # The `renv` directory is automatically skipped when deploying with rsconnect.
5
+ message("No 'renv' directory found; renv won't be activated.")
6
+ }
7
+
8
+ # Allow absolute module imports (relative to the app root).
9
+ options(box.path = getwd())
.github/workflows/rhino-test.yml ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Rhino Test
2
+ on: push
3
+ permissions:
4
+ contents: read
5
+ jobs:
6
+ main:
7
+ name: Run linters and tests
8
+ runs-on: ubuntu-20.04
9
+ env:
10
+ GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
11
+ steps:
12
+ - name: Checkout repo
13
+ uses: actions/checkout@v2
14
+
15
+ - name: Extract R version from lockfile
16
+ run: printf 'R_VERSION=%s\n' "$(jq --raw-output .R.Version renv.lock)" >> $GITHUB_ENV
17
+
18
+ - name: Setup R
19
+ uses: r-lib/actions/setup-r@v2
20
+ with:
21
+ r-version: ${{ env.R_VERSION }}
22
+
23
+ - name: Setup system dependencies
24
+ run: >
25
+ sudo apt-get update && sudo apt-get install --yes
26
+ libcurl4-openssl-dev
27
+
28
+ - name: Restore renv from cache
29
+ uses: actions/cache@v2
30
+ env:
31
+ CACHE_KEY: renv-${{ runner.arch }}-${{ runner.os }}-${{ env.R_VERSION }}
32
+ with:
33
+ path: renv/library
34
+ key: ${{ env.CACHE_KEY }}-${{ hashFiles('renv.lock') }}
35
+ restore-keys: ${{ env.CACHE_KEY }}-
36
+
37
+ - name: Sync renv with lockfile
38
+ shell: Rscript {0}
39
+ run: |
40
+ options(renv.config.cache.symlinks = FALSE)
41
+ renv::restore(clean = TRUE)
42
+
43
+ - name: Setup Node
44
+ uses: actions/setup-node@v2
45
+ with:
46
+ node-version: 16
47
+
48
+ - name: Lint R
49
+ if: always()
50
+ shell: Rscript {0}
51
+ run: rhino::lint_r()
52
+
53
+ - name: Lint JavaScript
54
+ if: always()
55
+ shell: Rscript {0}
56
+ run: rhino::lint_js()
57
+
58
+ - name: Lint Sass
59
+ if: always()
60
+ shell: Rscript {0}
61
+ run: rhino::lint_sass()
62
+
63
+ - name: Build JavaScript
64
+ if: always()
65
+ shell: Rscript {0}
66
+ run: rhino::build_js()
67
+
68
+ - name: Build Sass
69
+ if: always()
70
+ shell: Rscript {0}
71
+ run: rhino::build_sass()
72
+
73
+ - name: Run R unit tests
74
+ if: always()
75
+ shell: Rscript {0}
76
+ run: rhino::test_r()
77
+
78
+ - name: Run Cypress end-to-end tests
79
+ if: always()
80
+ uses: cypress-io/github-action@v2
81
+ with:
82
+ working-directory: .rhino # Created by earlier commands which use Node.js
83
+ start: npm run run-app
84
+ project: ../tests
.lintr ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ linters:
2
+ linters_with_defaults(
3
+ line_length_linter = line_length_linter(100),
4
+ object_usage_linter = NULL # Does not work with `box::use()`.
5
+ )
.renvignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # Only use `dependencies.R` to infer project dependencies.
2
+ *
3
+ !dependencies.R
.rscignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ .github
2
+ .lintr
3
+ .renvignore
4
+ .Renviron
5
+ .rhino
6
+ .rscignore
7
+ tests
Dockerfile CHANGED
@@ -1,17 +1,19 @@
1
- FROM rocker/shiny-verse:latest
 
 
 
 
2
 
3
  WORKDIR /code
4
 
5
  # Install stable packages from CRAN
6
  RUN install2.r --error \
7
- ggExtra \
8
- shiny
9
-
10
- # Install development packages from GitHub
11
- RUN installGithub.r \
12
- rstudio/bslib \
13
- rstudio/httpuv
14
 
15
  COPY . .
16
 
 
 
 
 
17
  CMD ["R", "--quiet", "-e", "shiny::runApp(host='0.0.0.0', port=7860)"]
 
1
+ FROM rocker/shiny-verse:4.3.0
2
+
3
+ # Workaround for renv cache
4
+ RUN mkdir /.cache
5
+ RUN chmod 777 /.cache
6
 
7
  WORKDIR /code
8
 
9
  # Install stable packages from CRAN
10
  RUN install2.r --error \
11
+ renv
 
 
 
 
 
 
12
 
13
  COPY . .
14
 
15
+ RUN Rscript -e 'options(renv.config.cache.enabled = FALSE); renv::restore(prompt = FALSE)'
16
+
17
+ EXPOSE 7860
18
+
19
  CMD ["R", "--quiet", "-e", "shiny::runApp(host='0.0.0.0', port=7860)"]
README.md CHANGED
@@ -6,6 +6,7 @@ colorTo: yellow
6
  sdk: docker
7
  pinned: false
8
  duplicated_from: posit/shiny-for-r-template
 
9
  ---
10
 
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
6
  sdk: docker
7
  pinned: false
8
  duplicated_from: posit/shiny-for-r-template
9
+ license: lgpl-3.0
10
  ---
11
 
12
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
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()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/js/index.js ADDED
File without changes
app/logic/__init__.R ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Logic: application code independent from Shiny.
2
+ # https://go.appsilon.com/rhino-project-structure
app/main.R ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ box::use(
2
+ shiny[bootstrapPage, div, moduleServer, NS, renderUI, tags, uiOutput],
3
+ )
4
+
5
+ #' @export
6
+ ui <- function(id) {
7
+ ns <- NS(id)
8
+ bootstrapPage(
9
+ uiOutput(ns("message"))
10
+ )
11
+ }
12
+
13
+ #' @export
14
+ server <- function(id) {
15
+ moduleServer(id, function(input, output, session) {
16
+ output$message <- renderUI({
17
+ div(
18
+ style = "display: flex; justify-content: center; align-items: center; height: 100vh;",
19
+ tags$h1(
20
+ tags$a("Check out Rhino docs!", href = "https://appsilon.github.io/rhino/")
21
+ )
22
+ )
23
+ })
24
+ })
25
+ }
app/static/favicon.ico ADDED
app/styles/main.scss ADDED
File without changes
app/view/__init__.R ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # View: Shiny modules and related code.
2
+ # https://go.appsilon.com/rhino-project-structure
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)
penguins.csv DELETED
@@ -1,345 +0,0 @@
1
- Species,Island,Bill Length (mm),Bill Depth (mm),Flipper Length (mm),Body Mass (g),Sex,Year
2
- Adelie,Torgersen,39.1,18.7,181,3750,male,2007
3
- Adelie,Torgersen,39.5,17.4,186,3800,female,2007
4
- Adelie,Torgersen,40.3,18,195,3250,female,2007
5
- Adelie,Torgersen,NA,NA,NA,NA,NA,2007
6
- Adelie,Torgersen,36.7,19.3,193,3450,female,2007
7
- Adelie,Torgersen,39.3,20.6,190,3650,male,2007
8
- Adelie,Torgersen,38.9,17.8,181,3625,female,2007
9
- Adelie,Torgersen,39.2,19.6,195,4675,male,2007
10
- Adelie,Torgersen,34.1,18.1,193,3475,NA,2007
11
- Adelie,Torgersen,42,20.2,190,4250,NA,2007
12
- Adelie,Torgersen,37.8,17.1,186,3300,NA,2007
13
- Adelie,Torgersen,37.8,17.3,180,3700,NA,2007
14
- Adelie,Torgersen,41.1,17.6,182,3200,female,2007
15
- Adelie,Torgersen,38.6,21.2,191,3800,male,2007
16
- Adelie,Torgersen,34.6,21.1,198,4400,male,2007
17
- Adelie,Torgersen,36.6,17.8,185,3700,female,2007
18
- Adelie,Torgersen,38.7,19,195,3450,female,2007
19
- Adelie,Torgersen,42.5,20.7,197,4500,male,2007
20
- Adelie,Torgersen,34.4,18.4,184,3325,female,2007
21
- Adelie,Torgersen,46,21.5,194,4200,male,2007
22
- Adelie,Biscoe,37.8,18.3,174,3400,female,2007
23
- Adelie,Biscoe,37.7,18.7,180,3600,male,2007
24
- Adelie,Biscoe,35.9,19.2,189,3800,female,2007
25
- Adelie,Biscoe,38.2,18.1,185,3950,male,2007
26
- Adelie,Biscoe,38.8,17.2,180,3800,male,2007
27
- Adelie,Biscoe,35.3,18.9,187,3800,female,2007
28
- Adelie,Biscoe,40.6,18.6,183,3550,male,2007
29
- Adelie,Biscoe,40.5,17.9,187,3200,female,2007
30
- Adelie,Biscoe,37.9,18.6,172,3150,female,2007
31
- Adelie,Biscoe,40.5,18.9,180,3950,male,2007
32
- Adelie,Dream,39.5,16.7,178,3250,female,2007
33
- Adelie,Dream,37.2,18.1,178,3900,male,2007
34
- Adelie,Dream,39.5,17.8,188,3300,female,2007
35
- Adelie,Dream,40.9,18.9,184,3900,male,2007
36
- Adelie,Dream,36.4,17,195,3325,female,2007
37
- Adelie,Dream,39.2,21.1,196,4150,male,2007
38
- Adelie,Dream,38.8,20,190,3950,male,2007
39
- Adelie,Dream,42.2,18.5,180,3550,female,2007
40
- Adelie,Dream,37.6,19.3,181,3300,female,2007
41
- Adelie,Dream,39.8,19.1,184,4650,male,2007
42
- Adelie,Dream,36.5,18,182,3150,female,2007
43
- Adelie,Dream,40.8,18.4,195,3900,male,2007
44
- Adelie,Dream,36,18.5,186,3100,female,2007
45
- Adelie,Dream,44.1,19.7,196,4400,male,2007
46
- Adelie,Dream,37,16.9,185,3000,female,2007
47
- Adelie,Dream,39.6,18.8,190,4600,male,2007
48
- Adelie,Dream,41.1,19,182,3425,male,2007
49
- Adelie,Dream,37.5,18.9,179,2975,NA,2007
50
- Adelie,Dream,36,17.9,190,3450,female,2007
51
- Adelie,Dream,42.3,21.2,191,4150,male,2007
52
- Adelie,Biscoe,39.6,17.7,186,3500,female,2008
53
- Adelie,Biscoe,40.1,18.9,188,4300,male,2008
54
- Adelie,Biscoe,35,17.9,190,3450,female,2008
55
- Adelie,Biscoe,42,19.5,200,4050,male,2008
56
- Adelie,Biscoe,34.5,18.1,187,2900,female,2008
57
- Adelie,Biscoe,41.4,18.6,191,3700,male,2008
58
- Adelie,Biscoe,39,17.5,186,3550,female,2008
59
- Adelie,Biscoe,40.6,18.8,193,3800,male,2008
60
- Adelie,Biscoe,36.5,16.6,181,2850,female,2008
61
- Adelie,Biscoe,37.6,19.1,194,3750,male,2008
62
- Adelie,Biscoe,35.7,16.9,185,3150,female,2008
63
- Adelie,Biscoe,41.3,21.1,195,4400,male,2008
64
- Adelie,Biscoe,37.6,17,185,3600,female,2008
65
- Adelie,Biscoe,41.1,18.2,192,4050,male,2008
66
- Adelie,Biscoe,36.4,17.1,184,2850,female,2008
67
- Adelie,Biscoe,41.6,18,192,3950,male,2008
68
- Adelie,Biscoe,35.5,16.2,195,3350,female,2008
69
- Adelie,Biscoe,41.1,19.1,188,4100,male,2008
70
- Adelie,Torgersen,35.9,16.6,190,3050,female,2008
71
- Adelie,Torgersen,41.8,19.4,198,4450,male,2008
72
- Adelie,Torgersen,33.5,19,190,3600,female,2008
73
- Adelie,Torgersen,39.7,18.4,190,3900,male,2008
74
- Adelie,Torgersen,39.6,17.2,196,3550,female,2008
75
- Adelie,Torgersen,45.8,18.9,197,4150,male,2008
76
- Adelie,Torgersen,35.5,17.5,190,3700,female,2008
77
- Adelie,Torgersen,42.8,18.5,195,4250,male,2008
78
- Adelie,Torgersen,40.9,16.8,191,3700,female,2008
79
- Adelie,Torgersen,37.2,19.4,184,3900,male,2008
80
- Adelie,Torgersen,36.2,16.1,187,3550,female,2008
81
- Adelie,Torgersen,42.1,19.1,195,4000,male,2008
82
- Adelie,Torgersen,34.6,17.2,189,3200,female,2008
83
- Adelie,Torgersen,42.9,17.6,196,4700,male,2008
84
- Adelie,Torgersen,36.7,18.8,187,3800,female,2008
85
- Adelie,Torgersen,35.1,19.4,193,4200,male,2008
86
- Adelie,Dream,37.3,17.8,191,3350,female,2008
87
- Adelie,Dream,41.3,20.3,194,3550,male,2008
88
- Adelie,Dream,36.3,19.5,190,3800,male,2008
89
- Adelie,Dream,36.9,18.6,189,3500,female,2008
90
- Adelie,Dream,38.3,19.2,189,3950,male,2008
91
- Adelie,Dream,38.9,18.8,190,3600,female,2008
92
- Adelie,Dream,35.7,18,202,3550,female,2008
93
- Adelie,Dream,41.1,18.1,205,4300,male,2008
94
- Adelie,Dream,34,17.1,185,3400,female,2008
95
- Adelie,Dream,39.6,18.1,186,4450,male,2008
96
- Adelie,Dream,36.2,17.3,187,3300,female,2008
97
- Adelie,Dream,40.8,18.9,208,4300,male,2008
98
- Adelie,Dream,38.1,18.6,190,3700,female,2008
99
- Adelie,Dream,40.3,18.5,196,4350,male,2008
100
- Adelie,Dream,33.1,16.1,178,2900,female,2008
101
- Adelie,Dream,43.2,18.5,192,4100,male,2008
102
- Adelie,Biscoe,35,17.9,192,3725,female,2009
103
- Adelie,Biscoe,41,20,203,4725,male,2009
104
- Adelie,Biscoe,37.7,16,183,3075,female,2009
105
- Adelie,Biscoe,37.8,20,190,4250,male,2009
106
- Adelie,Biscoe,37.9,18.6,193,2925,female,2009
107
- Adelie,Biscoe,39.7,18.9,184,3550,male,2009
108
- Adelie,Biscoe,38.6,17.2,199,3750,female,2009
109
- Adelie,Biscoe,38.2,20,190,3900,male,2009
110
- Adelie,Biscoe,38.1,17,181,3175,female,2009
111
- Adelie,Biscoe,43.2,19,197,4775,male,2009
112
- Adelie,Biscoe,38.1,16.5,198,3825,female,2009
113
- Adelie,Biscoe,45.6,20.3,191,4600,male,2009
114
- Adelie,Biscoe,39.7,17.7,193,3200,female,2009
115
- Adelie,Biscoe,42.2,19.5,197,4275,male,2009
116
- Adelie,Biscoe,39.6,20.7,191,3900,female,2009
117
- Adelie,Biscoe,42.7,18.3,196,4075,male,2009
118
- Adelie,Torgersen,38.6,17,188,2900,female,2009
119
- Adelie,Torgersen,37.3,20.5,199,3775,male,2009
120
- Adelie,Torgersen,35.7,17,189,3350,female,2009
121
- Adelie,Torgersen,41.1,18.6,189,3325,male,2009
122
- Adelie,Torgersen,36.2,17.2,187,3150,female,2009
123
- Adelie,Torgersen,37.7,19.8,198,3500,male,2009
124
- Adelie,Torgersen,40.2,17,176,3450,female,2009
125
- Adelie,Torgersen,41.4,18.5,202,3875,male,2009
126
- Adelie,Torgersen,35.2,15.9,186,3050,female,2009
127
- Adelie,Torgersen,40.6,19,199,4000,male,2009
128
- Adelie,Torgersen,38.8,17.6,191,3275,female,2009
129
- Adelie,Torgersen,41.5,18.3,195,4300,male,2009
130
- Adelie,Torgersen,39,17.1,191,3050,female,2009
131
- Adelie,Torgersen,44.1,18,210,4000,male,2009
132
- Adelie,Torgersen,38.5,17.9,190,3325,female,2009
133
- Adelie,Torgersen,43.1,19.2,197,3500,male,2009
134
- Adelie,Dream,36.8,18.5,193,3500,female,2009
135
- Adelie,Dream,37.5,18.5,199,4475,male,2009
136
- Adelie,Dream,38.1,17.6,187,3425,female,2009
137
- Adelie,Dream,41.1,17.5,190,3900,male,2009
138
- Adelie,Dream,35.6,17.5,191,3175,female,2009
139
- Adelie,Dream,40.2,20.1,200,3975,male,2009
140
- Adelie,Dream,37,16.5,185,3400,female,2009
141
- Adelie,Dream,39.7,17.9,193,4250,male,2009
142
- Adelie,Dream,40.2,17.1,193,3400,female,2009
143
- Adelie,Dream,40.6,17.2,187,3475,male,2009
144
- Adelie,Dream,32.1,15.5,188,3050,female,2009
145
- Adelie,Dream,40.7,17,190,3725,male,2009
146
- Adelie,Dream,37.3,16.8,192,3000,female,2009
147
- Adelie,Dream,39,18.7,185,3650,male,2009
148
- Adelie,Dream,39.2,18.6,190,4250,male,2009
149
- Adelie,Dream,36.6,18.4,184,3475,female,2009
150
- Adelie,Dream,36,17.8,195,3450,female,2009
151
- Adelie,Dream,37.8,18.1,193,3750,male,2009
152
- Adelie,Dream,36,17.1,187,3700,female,2009
153
- Adelie,Dream,41.5,18.5,201,4000,male,2009
154
- Gentoo,Biscoe,46.1,13.2,211,4500,female,2007
155
- Gentoo,Biscoe,50,16.3,230,5700,male,2007
156
- Gentoo,Biscoe,48.7,14.1,210,4450,female,2007
157
- Gentoo,Biscoe,50,15.2,218,5700,male,2007
158
- Gentoo,Biscoe,47.6,14.5,215,5400,male,2007
159
- Gentoo,Biscoe,46.5,13.5,210,4550,female,2007
160
- Gentoo,Biscoe,45.4,14.6,211,4800,female,2007
161
- Gentoo,Biscoe,46.7,15.3,219,5200,male,2007
162
- Gentoo,Biscoe,43.3,13.4,209,4400,female,2007
163
- Gentoo,Biscoe,46.8,15.4,215,5150,male,2007
164
- Gentoo,Biscoe,40.9,13.7,214,4650,female,2007
165
- Gentoo,Biscoe,49,16.1,216,5550,male,2007
166
- Gentoo,Biscoe,45.5,13.7,214,4650,female,2007
167
- Gentoo,Biscoe,48.4,14.6,213,5850,male,2007
168
- Gentoo,Biscoe,45.8,14.6,210,4200,female,2007
169
- Gentoo,Biscoe,49.3,15.7,217,5850,male,2007
170
- Gentoo,Biscoe,42,13.5,210,4150,female,2007
171
- Gentoo,Biscoe,49.2,15.2,221,6300,male,2007
172
- Gentoo,Biscoe,46.2,14.5,209,4800,female,2007
173
- Gentoo,Biscoe,48.7,15.1,222,5350,male,2007
174
- Gentoo,Biscoe,50.2,14.3,218,5700,male,2007
175
- Gentoo,Biscoe,45.1,14.5,215,5000,female,2007
176
- Gentoo,Biscoe,46.5,14.5,213,4400,female,2007
177
- Gentoo,Biscoe,46.3,15.8,215,5050,male,2007
178
- Gentoo,Biscoe,42.9,13.1,215,5000,female,2007
179
- Gentoo,Biscoe,46.1,15.1,215,5100,male,2007
180
- Gentoo,Biscoe,44.5,14.3,216,4100,NA,2007
181
- Gentoo,Biscoe,47.8,15,215,5650,male,2007
182
- Gentoo,Biscoe,48.2,14.3,210,4600,female,2007
183
- Gentoo,Biscoe,50,15.3,220,5550,male,2007
184
- Gentoo,Biscoe,47.3,15.3,222,5250,male,2007
185
- Gentoo,Biscoe,42.8,14.2,209,4700,female,2007
186
- Gentoo,Biscoe,45.1,14.5,207,5050,female,2007
187
- Gentoo,Biscoe,59.6,17,230,6050,male,2007
188
- Gentoo,Biscoe,49.1,14.8,220,5150,female,2008
189
- Gentoo,Biscoe,48.4,16.3,220,5400,male,2008
190
- Gentoo,Biscoe,42.6,13.7,213,4950,female,2008
191
- Gentoo,Biscoe,44.4,17.3,219,5250,male,2008
192
- Gentoo,Biscoe,44,13.6,208,4350,female,2008
193
- Gentoo,Biscoe,48.7,15.7,208,5350,male,2008
194
- Gentoo,Biscoe,42.7,13.7,208,3950,female,2008
195
- Gentoo,Biscoe,49.6,16,225,5700,male,2008
196
- Gentoo,Biscoe,45.3,13.7,210,4300,female,2008
197
- Gentoo,Biscoe,49.6,15,216,4750,male,2008
198
- Gentoo,Biscoe,50.5,15.9,222,5550,male,2008
199
- Gentoo,Biscoe,43.6,13.9,217,4900,female,2008
200
- Gentoo,Biscoe,45.5,13.9,210,4200,female,2008
201
- Gentoo,Biscoe,50.5,15.9,225,5400,male,2008
202
- Gentoo,Biscoe,44.9,13.3,213,5100,female,2008
203
- Gentoo,Biscoe,45.2,15.8,215,5300,male,2008
204
- Gentoo,Biscoe,46.6,14.2,210,4850,female,2008
205
- Gentoo,Biscoe,48.5,14.1,220,5300,male,2008
206
- Gentoo,Biscoe,45.1,14.4,210,4400,female,2008
207
- Gentoo,Biscoe,50.1,15,225,5000,male,2008
208
- Gentoo,Biscoe,46.5,14.4,217,4900,female,2008
209
- Gentoo,Biscoe,45,15.4,220,5050,male,2008
210
- Gentoo,Biscoe,43.8,13.9,208,4300,female,2008
211
- Gentoo,Biscoe,45.5,15,220,5000,male,2008
212
- Gentoo,Biscoe,43.2,14.5,208,4450,female,2008
213
- Gentoo,Biscoe,50.4,15.3,224,5550,male,2008
214
- Gentoo,Biscoe,45.3,13.8,208,4200,female,2008
215
- Gentoo,Biscoe,46.2,14.9,221,5300,male,2008
216
- Gentoo,Biscoe,45.7,13.9,214,4400,female,2008
217
- Gentoo,Biscoe,54.3,15.7,231,5650,male,2008
218
- Gentoo,Biscoe,45.8,14.2,219,4700,female,2008
219
- Gentoo,Biscoe,49.8,16.8,230,5700,male,2008
220
- Gentoo,Biscoe,46.2,14.4,214,4650,NA,2008
221
- Gentoo,Biscoe,49.5,16.2,229,5800,male,2008
222
- Gentoo,Biscoe,43.5,14.2,220,4700,female,2008
223
- Gentoo,Biscoe,50.7,15,223,5550,male,2008
224
- Gentoo,Biscoe,47.7,15,216,4750,female,2008
225
- Gentoo,Biscoe,46.4,15.6,221,5000,male,2008
226
- Gentoo,Biscoe,48.2,15.6,221,5100,male,2008
227
- Gentoo,Biscoe,46.5,14.8,217,5200,female,2008
228
- Gentoo,Biscoe,46.4,15,216,4700,female,2008
229
- Gentoo,Biscoe,48.6,16,230,5800,male,2008
230
- Gentoo,Biscoe,47.5,14.2,209,4600,female,2008
231
- Gentoo,Biscoe,51.1,16.3,220,6000,male,2008
232
- Gentoo,Biscoe,45.2,13.8,215,4750,female,2008
233
- Gentoo,Biscoe,45.2,16.4,223,5950,male,2008
234
- Gentoo,Biscoe,49.1,14.5,212,4625,female,2009
235
- Gentoo,Biscoe,52.5,15.6,221,5450,male,2009
236
- Gentoo,Biscoe,47.4,14.6,212,4725,female,2009
237
- Gentoo,Biscoe,50,15.9,224,5350,male,2009
238
- Gentoo,Biscoe,44.9,13.8,212,4750,female,2009
239
- Gentoo,Biscoe,50.8,17.3,228,5600,male,2009
240
- Gentoo,Biscoe,43.4,14.4,218,4600,female,2009
241
- Gentoo,Biscoe,51.3,14.2,218,5300,male,2009
242
- Gentoo,Biscoe,47.5,14,212,4875,female,2009
243
- Gentoo,Biscoe,52.1,17,230,5550,male,2009
244
- Gentoo,Biscoe,47.5,15,218,4950,female,2009
245
- Gentoo,Biscoe,52.2,17.1,228,5400,male,2009
246
- Gentoo,Biscoe,45.5,14.5,212,4750,female,2009
247
- Gentoo,Biscoe,49.5,16.1,224,5650,male,2009
248
- Gentoo,Biscoe,44.5,14.7,214,4850,female,2009
249
- Gentoo,Biscoe,50.8,15.7,226,5200,male,2009
250
- Gentoo,Biscoe,49.4,15.8,216,4925,male,2009
251
- Gentoo,Biscoe,46.9,14.6,222,4875,female,2009
252
- Gentoo,Biscoe,48.4,14.4,203,4625,female,2009
253
- Gentoo,Biscoe,51.1,16.5,225,5250,male,2009
254
- Gentoo,Biscoe,48.5,15,219,4850,female,2009
255
- Gentoo,Biscoe,55.9,17,228,5600,male,2009
256
- Gentoo,Biscoe,47.2,15.5,215,4975,female,2009
257
- Gentoo,Biscoe,49.1,15,228,5500,male,2009
258
- Gentoo,Biscoe,47.3,13.8,216,4725,NA,2009
259
- Gentoo,Biscoe,46.8,16.1,215,5500,male,2009
260
- Gentoo,Biscoe,41.7,14.7,210,4700,female,2009
261
- Gentoo,Biscoe,53.4,15.8,219,5500,male,2009
262
- Gentoo,Biscoe,43.3,14,208,4575,female,2009
263
- Gentoo,Biscoe,48.1,15.1,209,5500,male,2009
264
- Gentoo,Biscoe,50.5,15.2,216,5000,female,2009
265
- Gentoo,Biscoe,49.8,15.9,229,5950,male,2009
266
- Gentoo,Biscoe,43.5,15.2,213,4650,female,2009
267
- Gentoo,Biscoe,51.5,16.3,230,5500,male,2009
268
- Gentoo,Biscoe,46.2,14.1,217,4375,female,2009
269
- Gentoo,Biscoe,55.1,16,230,5850,male,2009
270
- Gentoo,Biscoe,44.5,15.7,217,4875,NA,2009
271
- Gentoo,Biscoe,48.8,16.2,222,6000,male,2009
272
- Gentoo,Biscoe,47.2,13.7,214,4925,female,2009
273
- Gentoo,Biscoe,NA,NA,NA,NA,NA,2009
274
- Gentoo,Biscoe,46.8,14.3,215,4850,female,2009
275
- Gentoo,Biscoe,50.4,15.7,222,5750,male,2009
276
- Gentoo,Biscoe,45.2,14.8,212,5200,female,2009
277
- Gentoo,Biscoe,49.9,16.1,213,5400,male,2009
278
- Chinstrap,Dream,46.5,17.9,192,3500,female,2007
279
- Chinstrap,Dream,50,19.5,196,3900,male,2007
280
- Chinstrap,Dream,51.3,19.2,193,3650,male,2007
281
- Chinstrap,Dream,45.4,18.7,188,3525,female,2007
282
- Chinstrap,Dream,52.7,19.8,197,3725,male,2007
283
- Chinstrap,Dream,45.2,17.8,198,3950,female,2007
284
- Chinstrap,Dream,46.1,18.2,178,3250,female,2007
285
- Chinstrap,Dream,51.3,18.2,197,3750,male,2007
286
- Chinstrap,Dream,46,18.9,195,4150,female,2007
287
- Chinstrap,Dream,51.3,19.9,198,3700,male,2007
288
- Chinstrap,Dream,46.6,17.8,193,3800,female,2007
289
- Chinstrap,Dream,51.7,20.3,194,3775,male,2007
290
- Chinstrap,Dream,47,17.3,185,3700,female,2007
291
- Chinstrap,Dream,52,18.1,201,4050,male,2007
292
- Chinstrap,Dream,45.9,17.1,190,3575,female,2007
293
- Chinstrap,Dream,50.5,19.6,201,4050,male,2007
294
- Chinstrap,Dream,50.3,20,197,3300,male,2007
295
- Chinstrap,Dream,58,17.8,181,3700,female,2007
296
- Chinstrap,Dream,46.4,18.6,190,3450,female,2007
297
- Chinstrap,Dream,49.2,18.2,195,4400,male,2007
298
- Chinstrap,Dream,42.4,17.3,181,3600,female,2007
299
- Chinstrap,Dream,48.5,17.5,191,3400,male,2007
300
- Chinstrap,Dream,43.2,16.6,187,2900,female,2007
301
- Chinstrap,Dream,50.6,19.4,193,3800,male,2007
302
- Chinstrap,Dream,46.7,17.9,195,3300,female,2007
303
- Chinstrap,Dream,52,19,197,4150,male,2007
304
- Chinstrap,Dream,50.5,18.4,200,3400,female,2008
305
- Chinstrap,Dream,49.5,19,200,3800,male,2008
306
- Chinstrap,Dream,46.4,17.8,191,3700,female,2008
307
- Chinstrap,Dream,52.8,20,205,4550,male,2008
308
- Chinstrap,Dream,40.9,16.6,187,3200,female,2008
309
- Chinstrap,Dream,54.2,20.8,201,4300,male,2008
310
- Chinstrap,Dream,42.5,16.7,187,3350,female,2008
311
- Chinstrap,Dream,51,18.8,203,4100,male,2008
312
- Chinstrap,Dream,49.7,18.6,195,3600,male,2008
313
- Chinstrap,Dream,47.5,16.8,199,3900,female,2008
314
- Chinstrap,Dream,47.6,18.3,195,3850,female,2008
315
- Chinstrap,Dream,52,20.7,210,4800,male,2008
316
- Chinstrap,Dream,46.9,16.6,192,2700,female,2008
317
- Chinstrap,Dream,53.5,19.9,205,4500,male,2008
318
- Chinstrap,Dream,49,19.5,210,3950,male,2008
319
- Chinstrap,Dream,46.2,17.5,187,3650,female,2008
320
- Chinstrap,Dream,50.9,19.1,196,3550,male,2008
321
- Chinstrap,Dream,45.5,17,196,3500,female,2008
322
- Chinstrap,Dream,50.9,17.9,196,3675,female,2009
323
- Chinstrap,Dream,50.8,18.5,201,4450,male,2009
324
- Chinstrap,Dream,50.1,17.9,190,3400,female,2009
325
- Chinstrap,Dream,49,19.6,212,4300,male,2009
326
- Chinstrap,Dream,51.5,18.7,187,3250,male,2009
327
- Chinstrap,Dream,49.8,17.3,198,3675,female,2009
328
- Chinstrap,Dream,48.1,16.4,199,3325,female,2009
329
- Chinstrap,Dream,51.4,19,201,3950,male,2009
330
- Chinstrap,Dream,45.7,17.3,193,3600,female,2009
331
- Chinstrap,Dream,50.7,19.7,203,4050,male,2009
332
- Chinstrap,Dream,42.5,17.3,187,3350,female,2009
333
- Chinstrap,Dream,52.2,18.8,197,3450,male,2009
334
- Chinstrap,Dream,45.2,16.6,191,3250,female,2009
335
- Chinstrap,Dream,49.3,19.9,203,4050,male,2009
336
- Chinstrap,Dream,50.2,18.8,202,3800,male,2009
337
- Chinstrap,Dream,45.6,19.4,194,3525,female,2009
338
- Chinstrap,Dream,51.9,19.5,206,3950,male,2009
339
- Chinstrap,Dream,46.8,16.5,189,3650,female,2009
340
- Chinstrap,Dream,45.7,17,195,3650,female,2009
341
- Chinstrap,Dream,55.8,19.8,207,4000,male,2009
342
- Chinstrap,Dream,43.5,18.1,202,3400,female,2009
343
- Chinstrap,Dream,49.6,18.2,193,3775,male,2009
344
- Chinstrap,Dream,50.8,19,210,4100,male,2009
345
- Chinstrap,Dream,50.2,18.7,198,3775,female,2009
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
renv.lock ADDED
@@ -0,0 +1,978 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "R": {
3
+ "Version": "4.3.0",
4
+ "Repositories": [
5
+ {
6
+ "Name": "RSPM",
7
+ "URL": "https://packagemanager.rstudio.com/all/latest"
8
+ },
9
+ {
10
+ "Name": "CRAN",
11
+ "URL": "https://cloud.r-project.org"
12
+ }
13
+ ]
14
+ },
15
+ "Packages": {
16
+ "R.cache": {
17
+ "Package": "R.cache",
18
+ "Version": "0.16.0",
19
+ "Source": "Repository",
20
+ "Repository": "RSPM",
21
+ "Requirements": [
22
+ "R",
23
+ "R.methodsS3",
24
+ "R.oo",
25
+ "R.utils",
26
+ "digest",
27
+ "utils"
28
+ ],
29
+ "Hash": "fe539ca3f8efb7410c3ae2cf5fe6c0f8"
30
+ },
31
+ "R.methodsS3": {
32
+ "Package": "R.methodsS3",
33
+ "Version": "1.8.2",
34
+ "Source": "Repository",
35
+ "Repository": "CRAN",
36
+ "Requirements": [
37
+ "R",
38
+ "utils"
39
+ ],
40
+ "Hash": "278c286fd6e9e75d0c2e8f731ea445c8"
41
+ },
42
+ "R.oo": {
43
+ "Package": "R.oo",
44
+ "Version": "1.25.0",
45
+ "Source": "Repository",
46
+ "Repository": "CRAN",
47
+ "Requirements": [
48
+ "R",
49
+ "R.methodsS3",
50
+ "methods",
51
+ "utils"
52
+ ],
53
+ "Hash": "a0900a114f4f0194cf4aa8cd4a700681"
54
+ },
55
+ "R.utils": {
56
+ "Package": "R.utils",
57
+ "Version": "2.12.2",
58
+ "Source": "Repository",
59
+ "Repository": "RSPM",
60
+ "Requirements": [
61
+ "R",
62
+ "R.methodsS3",
63
+ "R.oo",
64
+ "methods",
65
+ "tools",
66
+ "utils"
67
+ ],
68
+ "Hash": "325f01db13da12c04d8f6e7be36ff514"
69
+ },
70
+ "R6": {
71
+ "Package": "R6",
72
+ "Version": "2.5.1",
73
+ "Source": "Repository",
74
+ "Repository": "CRAN",
75
+ "Requirements": [
76
+ "R"
77
+ ],
78
+ "Hash": "470851b6d5d0ac559e9d01bb352b4021"
79
+ },
80
+ "Rcpp": {
81
+ "Package": "Rcpp",
82
+ "Version": "1.0.10",
83
+ "Source": "Repository",
84
+ "Repository": "RSPM",
85
+ "Requirements": [
86
+ "methods",
87
+ "utils"
88
+ ],
89
+ "Hash": "e749cae40fa9ef469b6050959517453c"
90
+ },
91
+ "backports": {
92
+ "Package": "backports",
93
+ "Version": "1.4.1",
94
+ "Source": "Repository",
95
+ "Repository": "CRAN",
96
+ "Requirements": [
97
+ "R"
98
+ ],
99
+ "Hash": "c39fbec8a30d23e721980b8afb31984c"
100
+ },
101
+ "base64enc": {
102
+ "Package": "base64enc",
103
+ "Version": "0.1-3",
104
+ "Source": "Repository",
105
+ "Repository": "CRAN",
106
+ "Requirements": [
107
+ "R"
108
+ ],
109
+ "Hash": "543776ae6848fde2f48ff3816d0628bc"
110
+ },
111
+ "box": {
112
+ "Package": "box",
113
+ "Version": "1.1.3",
114
+ "Source": "Repository",
115
+ "Repository": "RSPM",
116
+ "Requirements": [
117
+ "R",
118
+ "tools"
119
+ ],
120
+ "Hash": "ce8187a260e8e3abc2294284badc3b76"
121
+ },
122
+ "brio": {
123
+ "Package": "brio",
124
+ "Version": "1.1.3",
125
+ "Source": "Repository",
126
+ "Repository": "CRAN",
127
+ "Hash": "976cf154dfb043c012d87cddd8bca363"
128
+ },
129
+ "bslib": {
130
+ "Package": "bslib",
131
+ "Version": "0.4.2",
132
+ "Source": "Repository",
133
+ "Repository": "RSPM",
134
+ "Requirements": [
135
+ "R",
136
+ "base64enc",
137
+ "cachem",
138
+ "grDevices",
139
+ "htmltools",
140
+ "jquerylib",
141
+ "jsonlite",
142
+ "memoise",
143
+ "mime",
144
+ "rlang",
145
+ "sass"
146
+ ],
147
+ "Hash": "a7fbf03946ad741129dc81098722fca1"
148
+ },
149
+ "cachem": {
150
+ "Package": "cachem",
151
+ "Version": "1.0.8",
152
+ "Source": "Repository",
153
+ "Repository": "CRAN",
154
+ "Requirements": [
155
+ "fastmap",
156
+ "rlang"
157
+ ],
158
+ "Hash": "c35768291560ce302c0a6589f92e837d"
159
+ },
160
+ "callr": {
161
+ "Package": "callr",
162
+ "Version": "3.7.3",
163
+ "Source": "Repository",
164
+ "Repository": "RSPM",
165
+ "Requirements": [
166
+ "R",
167
+ "R6",
168
+ "processx",
169
+ "utils"
170
+ ],
171
+ "Hash": "9b2191ede20fa29828139b9900922e51"
172
+ },
173
+ "cli": {
174
+ "Package": "cli",
175
+ "Version": "3.6.1",
176
+ "Source": "Repository",
177
+ "Repository": "CRAN",
178
+ "Requirements": [
179
+ "R",
180
+ "utils"
181
+ ],
182
+ "Hash": "89e6d8219950eac806ae0c489052048a"
183
+ },
184
+ "codetools": {
185
+ "Package": "codetools",
186
+ "Version": "0.2-19",
187
+ "Source": "Repository",
188
+ "Repository": "CRAN",
189
+ "Requirements": [
190
+ "R"
191
+ ],
192
+ "Hash": "c089a619a7fae175d149d89164f8c7d8"
193
+ },
194
+ "commonmark": {
195
+ "Package": "commonmark",
196
+ "Version": "1.9.0",
197
+ "Source": "Repository",
198
+ "Repository": "RSPM",
199
+ "Hash": "d691c61bff84bd63c383874d2d0c3307"
200
+ },
201
+ "config": {
202
+ "Package": "config",
203
+ "Version": "0.3.1",
204
+ "Source": "Repository",
205
+ "Repository": "CRAN",
206
+ "Requirements": [
207
+ "yaml"
208
+ ],
209
+ "Hash": "31d77b09f63550cee9ecb5a08bf76e8f"
210
+ },
211
+ "crayon": {
212
+ "Package": "crayon",
213
+ "Version": "1.5.2",
214
+ "Source": "Repository",
215
+ "Repository": "CRAN",
216
+ "Requirements": [
217
+ "grDevices",
218
+ "methods",
219
+ "utils"
220
+ ],
221
+ "Hash": "e8a1e41acf02548751f45c718d55aa6a"
222
+ },
223
+ "cyclocomp": {
224
+ "Package": "cyclocomp",
225
+ "Version": "1.1.0",
226
+ "Source": "Repository",
227
+ "Repository": "CRAN",
228
+ "Requirements": [
229
+ "callr",
230
+ "crayon",
231
+ "desc",
232
+ "remotes",
233
+ "withr"
234
+ ],
235
+ "Hash": "53cbed70a2f7472d48fb6aef08442f25"
236
+ },
237
+ "desc": {
238
+ "Package": "desc",
239
+ "Version": "1.4.2",
240
+ "Source": "Repository",
241
+ "Repository": "CRAN",
242
+ "Requirements": [
243
+ "R",
244
+ "R6",
245
+ "cli",
246
+ "rprojroot",
247
+ "utils"
248
+ ],
249
+ "Hash": "6b9602c7ebbe87101a9c8edb6e8b6d21"
250
+ },
251
+ "diffobj": {
252
+ "Package": "diffobj",
253
+ "Version": "0.3.5",
254
+ "Source": "Repository",
255
+ "Repository": "CRAN",
256
+ "Requirements": [
257
+ "R",
258
+ "crayon",
259
+ "methods",
260
+ "stats",
261
+ "tools",
262
+ "utils"
263
+ ],
264
+ "Hash": "bcaa8b95f8d7d01a5dedfd959ce88ab8"
265
+ },
266
+ "digest": {
267
+ "Package": "digest",
268
+ "Version": "0.6.31",
269
+ "Source": "Repository",
270
+ "Repository": "CRAN",
271
+ "Requirements": [
272
+ "R",
273
+ "utils"
274
+ ],
275
+ "Hash": "8b708f296afd9ae69f450f9640be8990"
276
+ },
277
+ "ellipsis": {
278
+ "Package": "ellipsis",
279
+ "Version": "0.3.2",
280
+ "Source": "Repository",
281
+ "Repository": "CRAN",
282
+ "Requirements": [
283
+ "R",
284
+ "rlang"
285
+ ],
286
+ "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077"
287
+ },
288
+ "evaluate": {
289
+ "Package": "evaluate",
290
+ "Version": "0.20",
291
+ "Source": "Repository",
292
+ "Repository": "RSPM",
293
+ "Requirements": [
294
+ "R",
295
+ "methods"
296
+ ],
297
+ "Hash": "4b68aa51edd89a0e044a66e75ae3cc6c"
298
+ },
299
+ "fansi": {
300
+ "Package": "fansi",
301
+ "Version": "1.0.4",
302
+ "Source": "Repository",
303
+ "Repository": "CRAN",
304
+ "Requirements": [
305
+ "R",
306
+ "grDevices",
307
+ "utils"
308
+ ],
309
+ "Hash": "1d9e7ad3c8312a192dea7d3db0274fde"
310
+ },
311
+ "fastmap": {
312
+ "Package": "fastmap",
313
+ "Version": "1.1.1",
314
+ "Source": "Repository",
315
+ "Repository": "CRAN",
316
+ "Hash": "f7736a18de97dea803bde0a2daaafb27"
317
+ },
318
+ "fontawesome": {
319
+ "Package": "fontawesome",
320
+ "Version": "0.5.1",
321
+ "Source": "Repository",
322
+ "Repository": "RSPM",
323
+ "Requirements": [
324
+ "R",
325
+ "htmltools",
326
+ "rlang"
327
+ ],
328
+ "Hash": "1e22b8cabbad1eae951a75e9f8b52378"
329
+ },
330
+ "fs": {
331
+ "Package": "fs",
332
+ "Version": "1.6.2",
333
+ "Source": "Repository",
334
+ "Repository": "CRAN",
335
+ "Requirements": [
336
+ "R",
337
+ "methods"
338
+ ],
339
+ "Hash": "94af08e0aa9675a16fadbb3aaaa90d2a"
340
+ },
341
+ "glue": {
342
+ "Package": "glue",
343
+ "Version": "1.6.2",
344
+ "Source": "Repository",
345
+ "Repository": "CRAN",
346
+ "Requirements": [
347
+ "R",
348
+ "methods"
349
+ ],
350
+ "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e"
351
+ },
352
+ "highr": {
353
+ "Package": "highr",
354
+ "Version": "0.10",
355
+ "Source": "Repository",
356
+ "Repository": "RSPM",
357
+ "Requirements": [
358
+ "R",
359
+ "xfun"
360
+ ],
361
+ "Hash": "06230136b2d2b9ba5805e1963fa6e890"
362
+ },
363
+ "htmltools": {
364
+ "Package": "htmltools",
365
+ "Version": "0.5.5",
366
+ "Source": "Repository",
367
+ "Repository": "RSPM",
368
+ "Requirements": [
369
+ "R",
370
+ "base64enc",
371
+ "digest",
372
+ "ellipsis",
373
+ "fastmap",
374
+ "grDevices",
375
+ "rlang",
376
+ "utils"
377
+ ],
378
+ "Hash": "ba0240784ad50a62165058a27459304a"
379
+ },
380
+ "httpuv": {
381
+ "Package": "httpuv",
382
+ "Version": "1.6.11",
383
+ "Source": "Repository",
384
+ "Repository": "RSPM",
385
+ "Requirements": [
386
+ "R",
387
+ "R6",
388
+ "Rcpp",
389
+ "later",
390
+ "promises",
391
+ "utils"
392
+ ],
393
+ "Hash": "838602f54e32c1a0f8cc80708cefcefa"
394
+ },
395
+ "jquerylib": {
396
+ "Package": "jquerylib",
397
+ "Version": "0.1.4",
398
+ "Source": "Repository",
399
+ "Repository": "CRAN",
400
+ "Requirements": [
401
+ "htmltools"
402
+ ],
403
+ "Hash": "5aab57a3bd297eee1c1d862735972182"
404
+ },
405
+ "jsonlite": {
406
+ "Package": "jsonlite",
407
+ "Version": "1.8.4",
408
+ "Source": "Repository",
409
+ "Repository": "CRAN",
410
+ "Requirements": [
411
+ "methods"
412
+ ],
413
+ "Hash": "a4269a09a9b865579b2635c77e572374"
414
+ },
415
+ "knitr": {
416
+ "Package": "knitr",
417
+ "Version": "1.42",
418
+ "Source": "Repository",
419
+ "Repository": "RSPM",
420
+ "Requirements": [
421
+ "R",
422
+ "evaluate",
423
+ "highr",
424
+ "methods",
425
+ "tools",
426
+ "xfun",
427
+ "yaml"
428
+ ],
429
+ "Hash": "8329a9bcc82943c8069104d4be3ee22d"
430
+ },
431
+ "later": {
432
+ "Package": "later",
433
+ "Version": "1.3.1",
434
+ "Source": "Repository",
435
+ "Repository": "RSPM",
436
+ "Requirements": [
437
+ "Rcpp",
438
+ "rlang"
439
+ ],
440
+ "Hash": "40401c9cf2bc2259dfe83311c9384710"
441
+ },
442
+ "lazyeval": {
443
+ "Package": "lazyeval",
444
+ "Version": "0.2.2",
445
+ "Source": "Repository",
446
+ "Repository": "CRAN",
447
+ "Requirements": [
448
+ "R"
449
+ ],
450
+ "Hash": "d908914ae53b04d4c0c0fd72ecc35370"
451
+ },
452
+ "lifecycle": {
453
+ "Package": "lifecycle",
454
+ "Version": "1.0.3",
455
+ "Source": "Repository",
456
+ "Repository": "RSPM",
457
+ "Requirements": [
458
+ "R",
459
+ "cli",
460
+ "glue",
461
+ "rlang"
462
+ ],
463
+ "Hash": "001cecbeac1cff9301bdc3775ee46a86"
464
+ },
465
+ "lintr": {
466
+ "Package": "lintr",
467
+ "Version": "3.0.2",
468
+ "Source": "Repository",
469
+ "Repository": "RSPM",
470
+ "Requirements": [
471
+ "R",
472
+ "backports",
473
+ "codetools",
474
+ "crayon",
475
+ "cyclocomp",
476
+ "digest",
477
+ "glue",
478
+ "jsonlite",
479
+ "knitr",
480
+ "rex",
481
+ "stats",
482
+ "utils",
483
+ "xml2",
484
+ "xmlparsedata"
485
+ ],
486
+ "Hash": "b21ebd652d940f099915221f3328ab7b"
487
+ },
488
+ "logger": {
489
+ "Package": "logger",
490
+ "Version": "0.2.2",
491
+ "Source": "Repository",
492
+ "Repository": "CRAN",
493
+ "Requirements": [
494
+ "utils"
495
+ ],
496
+ "Hash": "c269b06beb2bbadb0d058c0e6fa4ec3d"
497
+ },
498
+ "magrittr": {
499
+ "Package": "magrittr",
500
+ "Version": "2.0.3",
501
+ "Source": "Repository",
502
+ "Repository": "CRAN",
503
+ "Requirements": [
504
+ "R"
505
+ ],
506
+ "Hash": "7ce2733a9826b3aeb1775d56fd305472"
507
+ },
508
+ "memoise": {
509
+ "Package": "memoise",
510
+ "Version": "2.0.1",
511
+ "Source": "Repository",
512
+ "Repository": "CRAN",
513
+ "Requirements": [
514
+ "cachem",
515
+ "rlang"
516
+ ],
517
+ "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c"
518
+ },
519
+ "mime": {
520
+ "Package": "mime",
521
+ "Version": "0.12",
522
+ "Source": "Repository",
523
+ "Repository": "CRAN",
524
+ "Requirements": [
525
+ "tools"
526
+ ],
527
+ "Hash": "18e9c28c1d3ca1560ce30658b22ce104"
528
+ },
529
+ "pillar": {
530
+ "Package": "pillar",
531
+ "Version": "1.9.0",
532
+ "Source": "Repository",
533
+ "Repository": "CRAN",
534
+ "Requirements": [
535
+ "cli",
536
+ "fansi",
537
+ "glue",
538
+ "lifecycle",
539
+ "rlang",
540
+ "utf8",
541
+ "utils",
542
+ "vctrs"
543
+ ],
544
+ "Hash": "15da5a8412f317beeee6175fbc76f4bb"
545
+ },
546
+ "pkgconfig": {
547
+ "Package": "pkgconfig",
548
+ "Version": "2.0.3",
549
+ "Source": "Repository",
550
+ "Repository": "CRAN",
551
+ "Requirements": [
552
+ "utils"
553
+ ],
554
+ "Hash": "01f28d4278f15c76cddbea05899c5d6f"
555
+ },
556
+ "pkgload": {
557
+ "Package": "pkgload",
558
+ "Version": "1.3.2",
559
+ "Source": "Repository",
560
+ "Repository": "RSPM",
561
+ "Requirements": [
562
+ "R",
563
+ "cli",
564
+ "crayon",
565
+ "desc",
566
+ "fs",
567
+ "glue",
568
+ "methods",
569
+ "rlang",
570
+ "rprojroot",
571
+ "utils",
572
+ "withr"
573
+ ],
574
+ "Hash": "6b0c222c5071efe0f3baf3dae9aa40e2"
575
+ },
576
+ "praise": {
577
+ "Package": "praise",
578
+ "Version": "1.0.0",
579
+ "Source": "Repository",
580
+ "Repository": "CRAN",
581
+ "Hash": "a555924add98c99d2f411e37e7d25e9f"
582
+ },
583
+ "processx": {
584
+ "Package": "processx",
585
+ "Version": "3.8.1",
586
+ "Source": "Repository",
587
+ "Repository": "RSPM",
588
+ "Requirements": [
589
+ "R",
590
+ "R6",
591
+ "ps",
592
+ "utils"
593
+ ],
594
+ "Hash": "d75b4059d781336efba24021915902b4"
595
+ },
596
+ "promises": {
597
+ "Package": "promises",
598
+ "Version": "1.2.0.1",
599
+ "Source": "Repository",
600
+ "Repository": "CRAN",
601
+ "Requirements": [
602
+ "R6",
603
+ "Rcpp",
604
+ "later",
605
+ "magrittr",
606
+ "rlang",
607
+ "stats"
608
+ ],
609
+ "Hash": "4ab2c43adb4d4699cf3690acd378d75d"
610
+ },
611
+ "ps": {
612
+ "Package": "ps",
613
+ "Version": "1.7.5",
614
+ "Source": "Repository",
615
+ "Repository": "RSPM",
616
+ "Requirements": [
617
+ "R",
618
+ "utils"
619
+ ],
620
+ "Hash": "709d852d33178db54b17c722e5b1e594"
621
+ },
622
+ "purrr": {
623
+ "Package": "purrr",
624
+ "Version": "1.0.1",
625
+ "Source": "Repository",
626
+ "Repository": "CRAN",
627
+ "Requirements": [
628
+ "R",
629
+ "cli",
630
+ "lifecycle",
631
+ "magrittr",
632
+ "rlang",
633
+ "vctrs"
634
+ ],
635
+ "Hash": "d71c815267c640f17ddbf7f16144b4bb"
636
+ },
637
+ "rappdirs": {
638
+ "Package": "rappdirs",
639
+ "Version": "0.3.3",
640
+ "Source": "Repository",
641
+ "Repository": "CRAN",
642
+ "Requirements": [
643
+ "R"
644
+ ],
645
+ "Hash": "5e3c5dc0b071b21fa128676560dbe94d"
646
+ },
647
+ "rematch2": {
648
+ "Package": "rematch2",
649
+ "Version": "2.1.2",
650
+ "Source": "Repository",
651
+ "Repository": "CRAN",
652
+ "Requirements": [
653
+ "tibble"
654
+ ],
655
+ "Hash": "76c9e04c712a05848ae7a23d2f170a40"
656
+ },
657
+ "remotes": {
658
+ "Package": "remotes",
659
+ "Version": "2.4.2",
660
+ "Source": "Repository",
661
+ "Repository": "CRAN",
662
+ "Requirements": [
663
+ "R",
664
+ "methods",
665
+ "stats",
666
+ "tools",
667
+ "utils"
668
+ ],
669
+ "Hash": "227045be9aee47e6dda9bb38ac870d67"
670
+ },
671
+ "renv": {
672
+ "Package": "renv",
673
+ "Version": "0.17.3",
674
+ "Source": "Repository",
675
+ "Repository": "RSPM",
676
+ "Requirements": [
677
+ "utils"
678
+ ],
679
+ "Hash": "4543b8cd233ae25c6aba8548be9e747e"
680
+ },
681
+ "rex": {
682
+ "Package": "rex",
683
+ "Version": "1.2.1",
684
+ "Source": "Repository",
685
+ "Repository": "CRAN",
686
+ "Requirements": [
687
+ "lazyeval"
688
+ ],
689
+ "Hash": "ae34cd56890607370665bee5bd17812f"
690
+ },
691
+ "rhino": {
692
+ "Package": "rhino",
693
+ "Version": "1.3.1",
694
+ "Source": "Repository",
695
+ "Repository": "RSPM",
696
+ "Requirements": [
697
+ "R",
698
+ "box",
699
+ "cli",
700
+ "config",
701
+ "fs",
702
+ "glue",
703
+ "lintr",
704
+ "logger",
705
+ "purrr",
706
+ "renv",
707
+ "rstudioapi",
708
+ "sass",
709
+ "shiny",
710
+ "styler",
711
+ "testthat",
712
+ "utils",
713
+ "withr",
714
+ "yaml"
715
+ ],
716
+ "Hash": "4254359242e97a77e07fe32659ac233e"
717
+ },
718
+ "rlang": {
719
+ "Package": "rlang",
720
+ "Version": "1.1.1",
721
+ "Source": "Repository",
722
+ "Repository": "RSPM",
723
+ "Requirements": [
724
+ "R",
725
+ "utils"
726
+ ],
727
+ "Hash": "a85c767b55f0bf9b7ad16c6d7baee5bb"
728
+ },
729
+ "rprojroot": {
730
+ "Package": "rprojroot",
731
+ "Version": "2.0.3",
732
+ "Source": "Repository",
733
+ "Repository": "CRAN",
734
+ "Requirements": [
735
+ "R"
736
+ ],
737
+ "Hash": "1de7ab598047a87bba48434ba35d497d"
738
+ },
739
+ "rstudioapi": {
740
+ "Package": "rstudioapi",
741
+ "Version": "0.14",
742
+ "Source": "Repository",
743
+ "Repository": "CRAN",
744
+ "Hash": "690bd2acc42a9166ce34845884459320"
745
+ },
746
+ "sass": {
747
+ "Package": "sass",
748
+ "Version": "0.4.6",
749
+ "Source": "Repository",
750
+ "Repository": "RSPM",
751
+ "Requirements": [
752
+ "R6",
753
+ "fs",
754
+ "htmltools",
755
+ "rappdirs",
756
+ "rlang"
757
+ ],
758
+ "Hash": "cc3ec7dd33982ef56570229b62d6388e"
759
+ },
760
+ "shiny": {
761
+ "Package": "shiny",
762
+ "Version": "1.7.4",
763
+ "Source": "Repository",
764
+ "Repository": "RSPM",
765
+ "Requirements": [
766
+ "R",
767
+ "R6",
768
+ "bslib",
769
+ "cachem",
770
+ "commonmark",
771
+ "crayon",
772
+ "ellipsis",
773
+ "fastmap",
774
+ "fontawesome",
775
+ "glue",
776
+ "grDevices",
777
+ "htmltools",
778
+ "httpuv",
779
+ "jsonlite",
780
+ "later",
781
+ "lifecycle",
782
+ "methods",
783
+ "mime",
784
+ "promises",
785
+ "rlang",
786
+ "sourcetools",
787
+ "tools",
788
+ "utils",
789
+ "withr",
790
+ "xtable"
791
+ ],
792
+ "Hash": "c2eae3d8c670fa9dfa35a12066f4a1d5"
793
+ },
794
+ "sourcetools": {
795
+ "Package": "sourcetools",
796
+ "Version": "0.1.7-1",
797
+ "Source": "Repository",
798
+ "Repository": "RSPM",
799
+ "Requirements": [
800
+ "R"
801
+ ],
802
+ "Hash": "5f5a7629f956619d519205ec475fe647"
803
+ },
804
+ "styler": {
805
+ "Package": "styler",
806
+ "Version": "1.9.1",
807
+ "Source": "Repository",
808
+ "Repository": "RSPM",
809
+ "Requirements": [
810
+ "R",
811
+ "R.cache",
812
+ "cli",
813
+ "magrittr",
814
+ "purrr",
815
+ "rlang",
816
+ "rprojroot",
817
+ "tools",
818
+ "vctrs",
819
+ "withr"
820
+ ],
821
+ "Hash": "ed8c90822b7da46beee603f263a85fe0"
822
+ },
823
+ "testthat": {
824
+ "Package": "testthat",
825
+ "Version": "3.1.8",
826
+ "Source": "Repository",
827
+ "Repository": "CRAN",
828
+ "Requirements": [
829
+ "R",
830
+ "R6",
831
+ "brio",
832
+ "callr",
833
+ "cli",
834
+ "desc",
835
+ "digest",
836
+ "ellipsis",
837
+ "evaluate",
838
+ "jsonlite",
839
+ "lifecycle",
840
+ "magrittr",
841
+ "methods",
842
+ "pkgload",
843
+ "praise",
844
+ "processx",
845
+ "ps",
846
+ "rlang",
847
+ "utils",
848
+ "waldo",
849
+ "withr"
850
+ ],
851
+ "Hash": "e0eded5dd915510f8e0d6e6277506203"
852
+ },
853
+ "tibble": {
854
+ "Package": "tibble",
855
+ "Version": "3.2.1",
856
+ "Source": "Repository",
857
+ "Repository": "CRAN",
858
+ "Requirements": [
859
+ "R",
860
+ "fansi",
861
+ "lifecycle",
862
+ "magrittr",
863
+ "methods",
864
+ "pillar",
865
+ "pkgconfig",
866
+ "rlang",
867
+ "utils",
868
+ "vctrs"
869
+ ],
870
+ "Hash": "a84e2cc86d07289b3b6f5069df7a004c"
871
+ },
872
+ "utf8": {
873
+ "Package": "utf8",
874
+ "Version": "1.2.3",
875
+ "Source": "Repository",
876
+ "Repository": "CRAN",
877
+ "Requirements": [
878
+ "R"
879
+ ],
880
+ "Hash": "1fe17157424bb09c48a8b3b550c753bc"
881
+ },
882
+ "vctrs": {
883
+ "Package": "vctrs",
884
+ "Version": "0.6.2",
885
+ "Source": "Repository",
886
+ "Repository": "RSPM",
887
+ "Requirements": [
888
+ "R",
889
+ "cli",
890
+ "glue",
891
+ "lifecycle",
892
+ "rlang"
893
+ ],
894
+ "Hash": "a745bda7aff4734c17294bb41d4e4607"
895
+ },
896
+ "waldo": {
897
+ "Package": "waldo",
898
+ "Version": "0.5.0",
899
+ "Source": "Repository",
900
+ "Repository": "RSPM",
901
+ "Requirements": [
902
+ "cli",
903
+ "diffobj",
904
+ "fansi",
905
+ "glue",
906
+ "methods",
907
+ "rematch2",
908
+ "rlang",
909
+ "tibble"
910
+ ],
911
+ "Hash": "57ddc85f4e22b2d4054f7db2962e3170"
912
+ },
913
+ "withr": {
914
+ "Package": "withr",
915
+ "Version": "2.5.0",
916
+ "Source": "Repository",
917
+ "Repository": "CRAN",
918
+ "Requirements": [
919
+ "R",
920
+ "grDevices",
921
+ "graphics",
922
+ "stats"
923
+ ],
924
+ "Hash": "c0e49a9760983e81e55cdd9be92e7182"
925
+ },
926
+ "xfun": {
927
+ "Package": "xfun",
928
+ "Version": "0.39",
929
+ "Source": "Repository",
930
+ "Repository": "RSPM",
931
+ "Requirements": [
932
+ "stats",
933
+ "tools"
934
+ ],
935
+ "Hash": "8f56e9acb54fb525e66464d57ab58bcb"
936
+ },
937
+ "xml2": {
938
+ "Package": "xml2",
939
+ "Version": "1.3.4",
940
+ "Source": "Repository",
941
+ "Repository": "RSPM",
942
+ "Requirements": [
943
+ "R",
944
+ "methods"
945
+ ],
946
+ "Hash": "7dc765ac9b909487326a7d471fdd3821"
947
+ },
948
+ "xmlparsedata": {
949
+ "Package": "xmlparsedata",
950
+ "Version": "1.0.5",
951
+ "Source": "Repository",
952
+ "Repository": "CRAN",
953
+ "Requirements": [
954
+ "R"
955
+ ],
956
+ "Hash": "45e4bf3c46476896e821fc0a408fb4fc"
957
+ },
958
+ "xtable": {
959
+ "Package": "xtable",
960
+ "Version": "1.8-4",
961
+ "Source": "Repository",
962
+ "Repository": "CRAN",
963
+ "Requirements": [
964
+ "R",
965
+ "stats",
966
+ "utils"
967
+ ],
968
+ "Hash": "b8acdf8af494d9ec19ccb2481a9b11c2"
969
+ },
970
+ "yaml": {
971
+ "Package": "yaml",
972
+ "Version": "2.3.7",
973
+ "Source": "Repository",
974
+ "Repository": "CRAN",
975
+ "Hash": "0d0056cc5383fbc240ccd0cb584bf436"
976
+ }
977
+ }
978
+ }
renv/.gitignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ library/
2
+ local/
3
+ cellar/
4
+ lock/
5
+ python/
6
+ sandbox/
7
+ staging/
renv/activate.R ADDED
@@ -0,0 +1,1032 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ local({
3
+
4
+ # the requested version of renv
5
+ version <- "0.17.3"
6
+
7
+ # the project directory
8
+ project <- getwd()
9
+
10
+ # figure out whether the autoloader is enabled
11
+ enabled <- local({
12
+
13
+ # first, check config option
14
+ override <- getOption("renv.config.autoloader.enabled")
15
+ if (!is.null(override))
16
+ return(override)
17
+
18
+ # next, check environment variables
19
+ # TODO: prefer using the configuration one in the future
20
+ envvars <- c(
21
+ "RENV_CONFIG_AUTOLOADER_ENABLED",
22
+ "RENV_AUTOLOADER_ENABLED",
23
+ "RENV_ACTIVATE_PROJECT"
24
+ )
25
+
26
+ for (envvar in envvars) {
27
+ envval <- Sys.getenv(envvar, unset = NA)
28
+ if (!is.na(envval))
29
+ return(tolower(envval) %in% c("true", "t", "1"))
30
+ }
31
+
32
+ # enable by default
33
+ TRUE
34
+
35
+ })
36
+
37
+ if (!enabled)
38
+ return(FALSE)
39
+
40
+ # avoid recursion
41
+ if (identical(getOption("renv.autoloader.running"), TRUE)) {
42
+ warning("ignoring recursive attempt to run renv autoloader")
43
+ return(invisible(TRUE))
44
+ }
45
+
46
+ # signal that we're loading renv during R startup
47
+ options(renv.autoloader.running = TRUE)
48
+ on.exit(options(renv.autoloader.running = NULL), add = TRUE)
49
+
50
+ # signal that we've consented to use renv
51
+ options(renv.consent = TRUE)
52
+
53
+ # load the 'utils' package eagerly -- this ensures that renv shims, which
54
+ # mask 'utils' packages, will come first on the search path
55
+ library(utils, lib.loc = .Library)
56
+
57
+ # unload renv if it's already been loaded
58
+ if ("renv" %in% loadedNamespaces())
59
+ unloadNamespace("renv")
60
+
61
+ # load bootstrap tools
62
+ `%||%` <- function(x, y) {
63
+ if (is.environment(x) || length(x)) x else y
64
+ }
65
+
66
+ `%??%` <- function(x, y) {
67
+ if (is.null(x)) y else x
68
+ }
69
+
70
+ bootstrap <- function(version, library) {
71
+
72
+ # attempt to download renv
73
+ tarball <- tryCatch(renv_bootstrap_download(version), error = identity)
74
+ if (inherits(tarball, "error"))
75
+ stop("failed to download renv ", version)
76
+
77
+ # now attempt to install
78
+ status <- tryCatch(renv_bootstrap_install(version, tarball, library), error = identity)
79
+ if (inherits(status, "error"))
80
+ stop("failed to install renv ", version)
81
+
82
+ }
83
+
84
+ renv_bootstrap_tests_running <- function() {
85
+ getOption("renv.tests.running", default = FALSE)
86
+ }
87
+
88
+ renv_bootstrap_repos <- function() {
89
+
90
+ # get CRAN repository
91
+ cran <- getOption("renv.repos.cran", "https://cloud.r-project.org")
92
+
93
+ # check for repos override
94
+ repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA)
95
+ if (!is.na(repos)) {
96
+
97
+ # check for RSPM; if set, use a fallback repository for renv
98
+ rspm <- Sys.getenv("RSPM", unset = NA)
99
+ if (identical(rspm, repos))
100
+ repos <- c(RSPM = rspm, CRAN = cran)
101
+
102
+ return(repos)
103
+
104
+ }
105
+
106
+ # check for lockfile repositories
107
+ repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity)
108
+ if (!inherits(repos, "error") && length(repos))
109
+ return(repos)
110
+
111
+ # if we're testing, re-use the test repositories
112
+ if (renv_bootstrap_tests_running()) {
113
+ repos <- getOption("renv.tests.repos")
114
+ if (!is.null(repos))
115
+ return(repos)
116
+ }
117
+
118
+ # retrieve current repos
119
+ repos <- getOption("repos")
120
+
121
+ # ensure @CRAN@ entries are resolved
122
+ repos[repos == "@CRAN@"] <- cran
123
+
124
+ # add in renv.bootstrap.repos if set
125
+ default <- c(FALLBACK = "https://cloud.r-project.org")
126
+ extra <- getOption("renv.bootstrap.repos", default = default)
127
+ repos <- c(repos, extra)
128
+
129
+ # remove duplicates that might've snuck in
130
+ dupes <- duplicated(repos) | duplicated(names(repos))
131
+ repos[!dupes]
132
+
133
+ }
134
+
135
+ renv_bootstrap_repos_lockfile <- function() {
136
+
137
+ lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock")
138
+ if (!file.exists(lockpath))
139
+ return(NULL)
140
+
141
+ lockfile <- tryCatch(renv_json_read(lockpath), error = identity)
142
+ if (inherits(lockfile, "error")) {
143
+ warning(lockfile)
144
+ return(NULL)
145
+ }
146
+
147
+ repos <- lockfile$R$Repositories
148
+ if (length(repos) == 0)
149
+ return(NULL)
150
+
151
+ keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1))
152
+ vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1))
153
+ names(vals) <- keys
154
+
155
+ return(vals)
156
+
157
+ }
158
+
159
+ renv_bootstrap_download <- function(version) {
160
+
161
+ # if the renv version number has 4 components, assume it must
162
+ # be retrieved via github
163
+ nv <- numeric_version(version)
164
+ components <- unclass(nv)[[1]]
165
+
166
+ # if this appears to be a development version of 'renv', we'll
167
+ # try to restore from github
168
+ dev <- length(components) == 4L
169
+
170
+ # begin collecting different methods for finding renv
171
+ methods <- c(
172
+ renv_bootstrap_download_tarball,
173
+ if (dev)
174
+ renv_bootstrap_download_github
175
+ else c(
176
+ renv_bootstrap_download_cran_latest,
177
+ renv_bootstrap_download_cran_archive
178
+ )
179
+ )
180
+
181
+ for (method in methods) {
182
+ path <- tryCatch(method(version), error = identity)
183
+ if (is.character(path) && file.exists(path))
184
+ return(path)
185
+ }
186
+
187
+ stop("failed to download renv ", version)
188
+
189
+ }
190
+
191
+ renv_bootstrap_download_impl <- function(url, destfile) {
192
+
193
+ mode <- "wb"
194
+
195
+ # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715
196
+ fixup <-
197
+ Sys.info()[["sysname"]] == "Windows" &&
198
+ substring(url, 1L, 5L) == "file:"
199
+
200
+ if (fixup)
201
+ mode <- "w+b"
202
+
203
+ args <- list(
204
+ url = url,
205
+ destfile = destfile,
206
+ mode = mode,
207
+ quiet = TRUE
208
+ )
209
+
210
+ if ("headers" %in% names(formals(utils::download.file)))
211
+ args$headers <- renv_bootstrap_download_custom_headers(url)
212
+
213
+ do.call(utils::download.file, args)
214
+
215
+ }
216
+
217
+ renv_bootstrap_download_custom_headers <- function(url) {
218
+
219
+ headers <- getOption("renv.download.headers")
220
+ if (is.null(headers))
221
+ return(character())
222
+
223
+ if (!is.function(headers))
224
+ stopf("'renv.download.headers' is not a function")
225
+
226
+ headers <- headers(url)
227
+ if (length(headers) == 0L)
228
+ return(character())
229
+
230
+ if (is.list(headers))
231
+ headers <- unlist(headers, recursive = FALSE, use.names = TRUE)
232
+
233
+ ok <-
234
+ is.character(headers) &&
235
+ is.character(names(headers)) &&
236
+ all(nzchar(names(headers)))
237
+
238
+ if (!ok)
239
+ stop("invocation of 'renv.download.headers' did not return a named character vector")
240
+
241
+ headers
242
+
243
+ }
244
+
245
+ renv_bootstrap_download_cran_latest <- function(version) {
246
+
247
+ spec <- renv_bootstrap_download_cran_latest_find(version)
248
+ type <- spec$type
249
+ repos <- spec$repos
250
+
251
+ message("* Downloading renv ", version, " ... ", appendLF = FALSE)
252
+
253
+ baseurl <- utils::contrib.url(repos = repos, type = type)
254
+ ext <- if (identical(type, "source"))
255
+ ".tar.gz"
256
+ else if (Sys.info()[["sysname"]] == "Windows")
257
+ ".zip"
258
+ else
259
+ ".tgz"
260
+ name <- sprintf("renv_%s%s", version, ext)
261
+ url <- paste(baseurl, name, sep = "/")
262
+
263
+ destfile <- file.path(tempdir(), name)
264
+ status <- tryCatch(
265
+ renv_bootstrap_download_impl(url, destfile),
266
+ condition = identity
267
+ )
268
+
269
+ if (inherits(status, "condition")) {
270
+ message("FAILED")
271
+ return(FALSE)
272
+ }
273
+
274
+ # report success and return
275
+ message("OK (downloaded ", type, ")")
276
+ destfile
277
+
278
+ }
279
+
280
+ renv_bootstrap_download_cran_latest_find <- function(version) {
281
+
282
+ # check whether binaries are supported on this system
283
+ binary <-
284
+ getOption("renv.bootstrap.binary", default = TRUE) &&
285
+ !identical(.Platform$pkgType, "source") &&
286
+ !identical(getOption("pkgType"), "source") &&
287
+ Sys.info()[["sysname"]] %in% c("Darwin", "Windows")
288
+
289
+ types <- c(if (binary) "binary", "source")
290
+
291
+ # iterate over types + repositories
292
+ for (type in types) {
293
+ for (repos in renv_bootstrap_repos()) {
294
+
295
+ # retrieve package database
296
+ db <- tryCatch(
297
+ as.data.frame(
298
+ utils::available.packages(type = type, repos = repos),
299
+ stringsAsFactors = FALSE
300
+ ),
301
+ error = identity
302
+ )
303
+
304
+ if (inherits(db, "error"))
305
+ next
306
+
307
+ # check for compatible entry
308
+ entry <- db[db$Package %in% "renv" & db$Version %in% version, ]
309
+ if (nrow(entry) == 0)
310
+ next
311
+
312
+ # found it; return spec to caller
313
+ spec <- list(entry = entry, type = type, repos = repos)
314
+ return(spec)
315
+
316
+ }
317
+ }
318
+
319
+ # if we got here, we failed to find renv
320
+ fmt <- "renv %s is not available from your declared package repositories"
321
+ stop(sprintf(fmt, version))
322
+
323
+ }
324
+
325
+ renv_bootstrap_download_cran_archive <- function(version) {
326
+
327
+ name <- sprintf("renv_%s.tar.gz", version)
328
+ repos <- renv_bootstrap_repos()
329
+ urls <- file.path(repos, "src/contrib/Archive/renv", name)
330
+ destfile <- file.path(tempdir(), name)
331
+
332
+ message("* Downloading renv ", version, " ... ", appendLF = FALSE)
333
+
334
+ for (url in urls) {
335
+
336
+ status <- tryCatch(
337
+ renv_bootstrap_download_impl(url, destfile),
338
+ condition = identity
339
+ )
340
+
341
+ if (identical(status, 0L)) {
342
+ message("OK")
343
+ return(destfile)
344
+ }
345
+
346
+ }
347
+
348
+ message("FAILED")
349
+ return(FALSE)
350
+
351
+ }
352
+
353
+ renv_bootstrap_download_tarball <- function(version) {
354
+
355
+ # if the user has provided the path to a tarball via
356
+ # an environment variable, then use it
357
+ tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA)
358
+ if (is.na(tarball))
359
+ return()
360
+
361
+ # allow directories
362
+ if (dir.exists(tarball)) {
363
+ name <- sprintf("renv_%s.tar.gz", version)
364
+ tarball <- file.path(tarball, name)
365
+ }
366
+
367
+ # bail if it doesn't exist
368
+ if (!file.exists(tarball)) {
369
+
370
+ # let the user know we weren't able to honour their request
371
+ fmt <- "* RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist."
372
+ msg <- sprintf(fmt, tarball)
373
+ warning(msg)
374
+
375
+ # bail
376
+ return()
377
+
378
+ }
379
+
380
+ fmt <- "* Bootstrapping with tarball at path '%s'."
381
+ msg <- sprintf(fmt, tarball)
382
+ message(msg)
383
+
384
+ tarball
385
+
386
+ }
387
+
388
+ renv_bootstrap_download_github <- function(version) {
389
+
390
+ enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE")
391
+ if (!identical(enabled, "TRUE"))
392
+ return(FALSE)
393
+
394
+ # prepare download options
395
+ pat <- Sys.getenv("GITHUB_PAT")
396
+ if (nzchar(Sys.which("curl")) && nzchar(pat)) {
397
+ fmt <- "--location --fail --header \"Authorization: token %s\""
398
+ extra <- sprintf(fmt, pat)
399
+ saved <- options("download.file.method", "download.file.extra")
400
+ options(download.file.method = "curl", download.file.extra = extra)
401
+ on.exit(do.call(base::options, saved), add = TRUE)
402
+ } else if (nzchar(Sys.which("wget")) && nzchar(pat)) {
403
+ fmt <- "--header=\"Authorization: token %s\""
404
+ extra <- sprintf(fmt, pat)
405
+ saved <- options("download.file.method", "download.file.extra")
406
+ options(download.file.method = "wget", download.file.extra = extra)
407
+ on.exit(do.call(base::options, saved), add = TRUE)
408
+ }
409
+
410
+ message("* Downloading renv ", version, " from GitHub ... ", appendLF = FALSE)
411
+
412
+ url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version)
413
+ name <- sprintf("renv_%s.tar.gz", version)
414
+ destfile <- file.path(tempdir(), name)
415
+
416
+ status <- tryCatch(
417
+ renv_bootstrap_download_impl(url, destfile),
418
+ condition = identity
419
+ )
420
+
421
+ if (!identical(status, 0L)) {
422
+ message("FAILED")
423
+ return(FALSE)
424
+ }
425
+
426
+ message("OK")
427
+ return(destfile)
428
+
429
+ }
430
+
431
+ renv_bootstrap_install <- function(version, tarball, library) {
432
+
433
+ # attempt to install it into project library
434
+ message("* Installing renv ", version, " ... ", appendLF = FALSE)
435
+ dir.create(library, showWarnings = FALSE, recursive = TRUE)
436
+
437
+ # invoke using system2 so we can capture and report output
438
+ bin <- R.home("bin")
439
+ exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R"
440
+ r <- file.path(bin, exe)
441
+
442
+ args <- c(
443
+ "--vanilla", "CMD", "INSTALL", "--no-multiarch",
444
+ "-l", shQuote(path.expand(library)),
445
+ shQuote(path.expand(tarball))
446
+ )
447
+
448
+ output <- system2(r, args, stdout = TRUE, stderr = TRUE)
449
+ message("Done!")
450
+
451
+ # check for successful install
452
+ status <- attr(output, "status")
453
+ if (is.numeric(status) && !identical(status, 0L)) {
454
+ header <- "Error installing renv:"
455
+ lines <- paste(rep.int("=", nchar(header)), collapse = "")
456
+ text <- c(header, lines, output)
457
+ writeLines(text, con = stderr())
458
+ }
459
+
460
+ status
461
+
462
+ }
463
+
464
+ renv_bootstrap_platform_prefix <- function() {
465
+
466
+ # construct version prefix
467
+ version <- paste(R.version$major, R.version$minor, sep = ".")
468
+ prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-")
469
+
470
+ # include SVN revision for development versions of R
471
+ # (to avoid sharing platform-specific artefacts with released versions of R)
472
+ devel <-
473
+ identical(R.version[["status"]], "Under development (unstable)") ||
474
+ identical(R.version[["nickname"]], "Unsuffered Consequences")
475
+
476
+ if (devel)
477
+ prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r")
478
+
479
+ # build list of path components
480
+ components <- c(prefix, R.version$platform)
481
+
482
+ # include prefix if provided by user
483
+ prefix <- renv_bootstrap_platform_prefix_impl()
484
+ if (!is.na(prefix) && nzchar(prefix))
485
+ components <- c(prefix, components)
486
+
487
+ # build prefix
488
+ paste(components, collapse = "/")
489
+
490
+ }
491
+
492
+ renv_bootstrap_platform_prefix_impl <- function() {
493
+
494
+ # if an explicit prefix has been supplied, use it
495
+ prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA)
496
+ if (!is.na(prefix))
497
+ return(prefix)
498
+
499
+ # if the user has requested an automatic prefix, generate it
500
+ auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA)
501
+ if (auto %in% c("TRUE", "True", "true", "1"))
502
+ return(renv_bootstrap_platform_prefix_auto())
503
+
504
+ # empty string on failure
505
+ ""
506
+
507
+ }
508
+
509
+ renv_bootstrap_platform_prefix_auto <- function() {
510
+
511
+ prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity)
512
+ if (inherits(prefix, "error") || prefix %in% "unknown") {
513
+
514
+ msg <- paste(
515
+ "failed to infer current operating system",
516
+ "please file a bug report at https://github.com/rstudio/renv/issues",
517
+ sep = "; "
518
+ )
519
+
520
+ warning(msg)
521
+
522
+ }
523
+
524
+ prefix
525
+
526
+ }
527
+
528
+ renv_bootstrap_platform_os <- function() {
529
+
530
+ sysinfo <- Sys.info()
531
+ sysname <- sysinfo[["sysname"]]
532
+
533
+ # handle Windows + macOS up front
534
+ if (sysname == "Windows")
535
+ return("windows")
536
+ else if (sysname == "Darwin")
537
+ return("macos")
538
+
539
+ # check for os-release files
540
+ for (file in c("/etc/os-release", "/usr/lib/os-release"))
541
+ if (file.exists(file))
542
+ return(renv_bootstrap_platform_os_via_os_release(file, sysinfo))
543
+
544
+ # check for redhat-release files
545
+ if (file.exists("/etc/redhat-release"))
546
+ return(renv_bootstrap_platform_os_via_redhat_release())
547
+
548
+ "unknown"
549
+
550
+ }
551
+
552
+ renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) {
553
+
554
+ # read /etc/os-release
555
+ release <- utils::read.table(
556
+ file = file,
557
+ sep = "=",
558
+ quote = c("\"", "'"),
559
+ col.names = c("Key", "Value"),
560
+ comment.char = "#",
561
+ stringsAsFactors = FALSE
562
+ )
563
+
564
+ vars <- as.list(release$Value)
565
+ names(vars) <- release$Key
566
+
567
+ # get os name
568
+ os <- tolower(sysinfo[["sysname"]])
569
+
570
+ # read id
571
+ id <- "unknown"
572
+ for (field in c("ID", "ID_LIKE")) {
573
+ if (field %in% names(vars) && nzchar(vars[[field]])) {
574
+ id <- vars[[field]]
575
+ break
576
+ }
577
+ }
578
+
579
+ # read version
580
+ version <- "unknown"
581
+ for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) {
582
+ if (field %in% names(vars) && nzchar(vars[[field]])) {
583
+ version <- vars[[field]]
584
+ break
585
+ }
586
+ }
587
+
588
+ # join together
589
+ paste(c(os, id, version), collapse = "-")
590
+
591
+ }
592
+
593
+ renv_bootstrap_platform_os_via_redhat_release <- function() {
594
+
595
+ # read /etc/redhat-release
596
+ contents <- readLines("/etc/redhat-release", warn = FALSE)
597
+
598
+ # infer id
599
+ id <- if (grepl("centos", contents, ignore.case = TRUE))
600
+ "centos"
601
+ else if (grepl("redhat", contents, ignore.case = TRUE))
602
+ "redhat"
603
+ else
604
+ "unknown"
605
+
606
+ # try to find a version component (very hacky)
607
+ version <- "unknown"
608
+
609
+ parts <- strsplit(contents, "[[:space:]]")[[1L]]
610
+ for (part in parts) {
611
+
612
+ nv <- tryCatch(numeric_version(part), error = identity)
613
+ if (inherits(nv, "error"))
614
+ next
615
+
616
+ version <- nv[1, 1]
617
+ break
618
+
619
+ }
620
+
621
+ paste(c("linux", id, version), collapse = "-")
622
+
623
+ }
624
+
625
+ renv_bootstrap_library_root_name <- function(project) {
626
+
627
+ # use project name as-is if requested
628
+ asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE")
629
+ if (asis)
630
+ return(basename(project))
631
+
632
+ # otherwise, disambiguate based on project's path
633
+ id <- substring(renv_bootstrap_hash_text(project), 1L, 8L)
634
+ paste(basename(project), id, sep = "-")
635
+
636
+ }
637
+
638
+ renv_bootstrap_library_root <- function(project) {
639
+
640
+ prefix <- renv_bootstrap_profile_prefix()
641
+
642
+ path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA)
643
+ if (!is.na(path))
644
+ return(paste(c(path, prefix), collapse = "/"))
645
+
646
+ path <- renv_bootstrap_library_root_impl(project)
647
+ if (!is.null(path)) {
648
+ name <- renv_bootstrap_library_root_name(project)
649
+ return(paste(c(path, prefix, name), collapse = "/"))
650
+ }
651
+
652
+ renv_bootstrap_paths_renv("library", project = project)
653
+
654
+ }
655
+
656
+ renv_bootstrap_library_root_impl <- function(project) {
657
+
658
+ root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA)
659
+ if (!is.na(root))
660
+ return(root)
661
+
662
+ type <- renv_bootstrap_project_type(project)
663
+ if (identical(type, "package")) {
664
+ userdir <- renv_bootstrap_user_dir()
665
+ return(file.path(userdir, "library"))
666
+ }
667
+
668
+ }
669
+
670
+ renv_bootstrap_validate_version <- function(version) {
671
+
672
+ loadedversion <- utils::packageDescription("renv", fields = "Version")
673
+ if (version == loadedversion)
674
+ return(TRUE)
675
+
676
+ # assume four-component versions are from GitHub;
677
+ # three-component versions are from CRAN
678
+ components <- strsplit(loadedversion, "[.-]")[[1]]
679
+ remote <- if (length(components) == 4L)
680
+ paste("rstudio/renv", loadedversion, sep = "@")
681
+ else
682
+ paste("renv", loadedversion, sep = "@")
683
+
684
+ fmt <- paste(
685
+ "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.",
686
+ "Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.",
687
+ "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.",
688
+ sep = "\n"
689
+ )
690
+
691
+ msg <- sprintf(fmt, loadedversion, version, remote)
692
+ warning(msg, call. = FALSE)
693
+
694
+ FALSE
695
+
696
+ }
697
+
698
+ renv_bootstrap_hash_text <- function(text) {
699
+
700
+ hashfile <- tempfile("renv-hash-")
701
+ on.exit(unlink(hashfile), add = TRUE)
702
+
703
+ writeLines(text, con = hashfile)
704
+ tools::md5sum(hashfile)
705
+
706
+ }
707
+
708
+ renv_bootstrap_load <- function(project, libpath, version) {
709
+
710
+ # try to load renv from the project library
711
+ if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE))
712
+ return(FALSE)
713
+
714
+ # warn if the version of renv loaded does not match
715
+ renv_bootstrap_validate_version(version)
716
+
717
+ # execute renv load hooks, if any
718
+ hooks <- getHook("renv::autoload")
719
+ for (hook in hooks)
720
+ if (is.function(hook))
721
+ tryCatch(hook(), error = warning)
722
+
723
+ # load the project
724
+ renv::load(project)
725
+
726
+ TRUE
727
+
728
+ }
729
+
730
+ renv_bootstrap_profile_load <- function(project) {
731
+
732
+ # if RENV_PROFILE is already set, just use that
733
+ profile <- Sys.getenv("RENV_PROFILE", unset = NA)
734
+ if (!is.na(profile) && nzchar(profile))
735
+ return(profile)
736
+
737
+ # check for a profile file (nothing to do if it doesn't exist)
738
+ path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project)
739
+ if (!file.exists(path))
740
+ return(NULL)
741
+
742
+ # read the profile, and set it if it exists
743
+ contents <- readLines(path, warn = FALSE)
744
+ if (length(contents) == 0L)
745
+ return(NULL)
746
+
747
+ # set RENV_PROFILE
748
+ profile <- contents[[1L]]
749
+ if (!profile %in% c("", "default"))
750
+ Sys.setenv(RENV_PROFILE = profile)
751
+
752
+ profile
753
+
754
+ }
755
+
756
+ renv_bootstrap_profile_prefix <- function() {
757
+ profile <- renv_bootstrap_profile_get()
758
+ if (!is.null(profile))
759
+ return(file.path("profiles", profile, "renv"))
760
+ }
761
+
762
+ renv_bootstrap_profile_get <- function() {
763
+ profile <- Sys.getenv("RENV_PROFILE", unset = "")
764
+ renv_bootstrap_profile_normalize(profile)
765
+ }
766
+
767
+ renv_bootstrap_profile_set <- function(profile) {
768
+ profile <- renv_bootstrap_profile_normalize(profile)
769
+ if (is.null(profile))
770
+ Sys.unsetenv("RENV_PROFILE")
771
+ else
772
+ Sys.setenv(RENV_PROFILE = profile)
773
+ }
774
+
775
+ renv_bootstrap_profile_normalize <- function(profile) {
776
+
777
+ if (is.null(profile) || profile %in% c("", "default"))
778
+ return(NULL)
779
+
780
+ profile
781
+
782
+ }
783
+
784
+ renv_bootstrap_path_absolute <- function(path) {
785
+
786
+ substr(path, 1L, 1L) %in% c("~", "/", "\\") || (
787
+ substr(path, 1L, 1L) %in% c(letters, LETTERS) &&
788
+ substr(path, 2L, 3L) %in% c(":/", ":\\")
789
+ )
790
+
791
+ }
792
+
793
+ renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) {
794
+ renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv")
795
+ root <- if (renv_bootstrap_path_absolute(renv)) NULL else project
796
+ prefix <- if (profile) renv_bootstrap_profile_prefix()
797
+ components <- c(root, renv, prefix, ...)
798
+ paste(components, collapse = "/")
799
+ }
800
+
801
+ renv_bootstrap_project_type <- function(path) {
802
+
803
+ descpath <- file.path(path, "DESCRIPTION")
804
+ if (!file.exists(descpath))
805
+ return("unknown")
806
+
807
+ desc <- tryCatch(
808
+ read.dcf(descpath, all = TRUE),
809
+ error = identity
810
+ )
811
+
812
+ if (inherits(desc, "error"))
813
+ return("unknown")
814
+
815
+ type <- desc$Type
816
+ if (!is.null(type))
817
+ return(tolower(type))
818
+
819
+ package <- desc$Package
820
+ if (!is.null(package))
821
+ return("package")
822
+
823
+ "unknown"
824
+
825
+ }
826
+
827
+ renv_bootstrap_user_dir <- function() {
828
+ dir <- renv_bootstrap_user_dir_impl()
829
+ path.expand(chartr("\\", "/", dir))
830
+ }
831
+
832
+ renv_bootstrap_user_dir_impl <- function() {
833
+
834
+ # use local override if set
835
+ override <- getOption("renv.userdir.override")
836
+ if (!is.null(override))
837
+ return(override)
838
+
839
+ # use R_user_dir if available
840
+ tools <- asNamespace("tools")
841
+ if (is.function(tools$R_user_dir))
842
+ return(tools$R_user_dir("renv", "cache"))
843
+
844
+ # try using our own backfill for older versions of R
845
+ envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME")
846
+ for (envvar in envvars) {
847
+ root <- Sys.getenv(envvar, unset = NA)
848
+ if (!is.na(root))
849
+ return(file.path(root, "R/renv"))
850
+ }
851
+
852
+ # use platform-specific default fallbacks
853
+ if (Sys.info()[["sysname"]] == "Windows")
854
+ file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv")
855
+ else if (Sys.info()[["sysname"]] == "Darwin")
856
+ "~/Library/Caches/org.R-project.R/R/renv"
857
+ else
858
+ "~/.cache/R/renv"
859
+
860
+ }
861
+
862
+
863
+ renv_json_read <- function(file = NULL, text = NULL) {
864
+
865
+ jlerr <- NULL
866
+
867
+ # if jsonlite is loaded, use that instead
868
+ if ("jsonlite" %in% loadedNamespaces()) {
869
+
870
+ json <- catch(renv_json_read_jsonlite(file, text))
871
+ if (!inherits(json, "error"))
872
+ return(json)
873
+
874
+ jlerr <- json
875
+
876
+ }
877
+
878
+ # otherwise, fall back to the default JSON reader
879
+ json <- catch(renv_json_read_default(file, text))
880
+ if (!inherits(json, "error"))
881
+ return(json)
882
+
883
+ # report an error
884
+ if (!is.null(jlerr))
885
+ stop(jlerr)
886
+ else
887
+ stop(json)
888
+
889
+ }
890
+
891
+ renv_json_read_jsonlite <- function(file = NULL, text = NULL) {
892
+ text <- paste(text %||% read(file), collapse = "\n")
893
+ jsonlite::fromJSON(txt = text, simplifyVector = FALSE)
894
+ }
895
+
896
+ renv_json_read_default <- function(file = NULL, text = NULL) {
897
+
898
+ # find strings in the JSON
899
+ text <- paste(text %||% read(file), collapse = "\n")
900
+ pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
901
+ locs <- gregexpr(pattern, text, perl = TRUE)[[1]]
902
+
903
+ # if any are found, replace them with placeholders
904
+ replaced <- text
905
+ strings <- character()
906
+ replacements <- character()
907
+
908
+ if (!identical(c(locs), -1L)) {
909
+
910
+ # get the string values
911
+ starts <- locs
912
+ ends <- locs + attr(locs, "match.length") - 1L
913
+ strings <- substring(text, starts, ends)
914
+
915
+ # only keep those requiring escaping
916
+ strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE)
917
+
918
+ # compute replacements
919
+ replacements <- sprintf('"\032%i\032"', seq_along(strings))
920
+
921
+ # replace the strings
922
+ mapply(function(string, replacement) {
923
+ replaced <<- sub(string, replacement, replaced, fixed = TRUE)
924
+ }, strings, replacements)
925
+
926
+ }
927
+
928
+ # transform the JSON into something the R parser understands
929
+ transformed <- replaced
930
+ transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE)
931
+ transformed <- gsub("[[{]", "list(", transformed, perl = TRUE)
932
+ transformed <- gsub("[]}]", ")", transformed, perl = TRUE)
933
+ transformed <- gsub(":", "=", transformed, fixed = TRUE)
934
+ text <- paste(transformed, collapse = "\n")
935
+
936
+ # parse it
937
+ json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]]
938
+
939
+ # construct map between source strings, replaced strings
940
+ map <- as.character(parse(text = strings))
941
+ names(map) <- as.character(parse(text = replacements))
942
+
943
+ # convert to list
944
+ map <- as.list(map)
945
+
946
+ # remap strings in object
947
+ remapped <- renv_json_remap(json, map)
948
+
949
+ # evaluate
950
+ eval(remapped, envir = baseenv())
951
+
952
+ }
953
+
954
+ renv_json_remap <- function(json, map) {
955
+
956
+ # fix names
957
+ if (!is.null(names(json))) {
958
+ lhs <- match(names(json), names(map), nomatch = 0L)
959
+ rhs <- match(names(map), names(json), nomatch = 0L)
960
+ names(json)[rhs] <- map[lhs]
961
+ }
962
+
963
+ # fix values
964
+ if (is.character(json))
965
+ return(map[[json]] %||% json)
966
+
967
+ # handle true, false, null
968
+ if (is.name(json)) {
969
+ text <- as.character(json)
970
+ if (text == "true")
971
+ return(TRUE)
972
+ else if (text == "false")
973
+ return(FALSE)
974
+ else if (text == "null")
975
+ return(NULL)
976
+ }
977
+
978
+ # recurse
979
+ if (is.recursive(json)) {
980
+ for (i in seq_along(json)) {
981
+ json[i] <- list(renv_json_remap(json[[i]], map))
982
+ }
983
+ }
984
+
985
+ json
986
+
987
+ }
988
+
989
+ # load the renv profile, if any
990
+ renv_bootstrap_profile_load(project)
991
+
992
+ # construct path to library root
993
+ root <- renv_bootstrap_library_root(project)
994
+
995
+ # construct library prefix for platform
996
+ prefix <- renv_bootstrap_platform_prefix()
997
+
998
+ # construct full libpath
999
+ libpath <- file.path(root, prefix)
1000
+
1001
+ # attempt to load
1002
+ if (renv_bootstrap_load(project, libpath, version))
1003
+ return(TRUE)
1004
+
1005
+ # load failed; inform user we're about to bootstrap
1006
+ prefix <- paste("# Bootstrapping renv", version)
1007
+ postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "")
1008
+ header <- paste(prefix, postfix)
1009
+ message(header)
1010
+
1011
+ # perform bootstrap
1012
+ bootstrap(version, libpath)
1013
+
1014
+ # exit early if we're just testing bootstrap
1015
+ if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA)))
1016
+ return(TRUE)
1017
+
1018
+ # try again to load
1019
+ if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) {
1020
+ message("* Successfully installed and loaded renv ", version, ".")
1021
+ return(renv::load())
1022
+ }
1023
+
1024
+ # failed to download or load renv; warn the user
1025
+ msg <- c(
1026
+ "Failed to find an renv installation: the project will not be loaded.",
1027
+ "Use `renv::activate()` to re-initialize the project."
1028
+ )
1029
+
1030
+ warning(paste(msg, collapse = "\n"), call. = FALSE)
1031
+
1032
+ })
renv/settings.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bioconductor.version": null,
3
+ "external.libraries": [],
4
+ "ignored.packages": [],
5
+ "package.dependency.fields": [
6
+ "Imports",
7
+ "Depends",
8
+ "LinkingTo"
9
+ ],
10
+ "r.version": null,
11
+ "snapshot.type": "implicit",
12
+ "use.cache": true,
13
+ "vcs.ignore.cellar": true,
14
+ "vcs.ignore.library": true,
15
+ "vcs.ignore.local": true,
16
+ "vcs.manage.ignores": true
17
+ }
rhino.yml ADDED
@@ -0,0 +1 @@
 
 
1
+ sass: node
shiny-for-r-rhino.Rproj ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Version: 1.0
2
+
3
+ RestoreWorkspace: No
4
+ SaveWorkspace: No
5
+ AlwaysSaveHistory: Default
6
+
7
+ EnableCodeIndexing: Yes
8
+ UseSpacesForTab: Yes
9
+ NumSpacesForTab: 2
10
+ Encoding: UTF-8
11
+
12
+ RnwWeave: Sweave
13
+ LaTeX: pdfLaTeX
14
+
15
+ AutoAppendNewline: Yes
16
+ StripTrailingWhitespace: Yes
17
+ LineEndingConversion: Posix
tests/cypress.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "baseUrl": "http://localhost:3333",
3
+ "pluginsFile": false,
4
+ "supportFile": false
5
+ }
tests/cypress/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ /screenshots/
2
+ /videos/
tests/cypress/integration/app.spec.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ describe('app', () => {
2
+ beforeEach(() => {
3
+ cy.visit('/')
4
+ })
5
+
6
+ it('starts', () => {})
7
+ })
tests/testthat/test-main.R ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ box::use(
2
+ shiny[testServer],
3
+ testthat[...],
4
+ )
5
+ box::use(
6
+ app/main[...],
7
+ )
8
+
9
+ test_that("main server works", {
10
+ testServer(server, {
11
+ expect_true(grepl(x = output$message$html, pattern = "Check out Rhino docs!"))
12
+ })
13
+ })