├── .github
└── workflows
│ └── bookdown.yaml
├── .gitignore
├── .travis.yml
├── 01-intro.Rmd
├── 02-literature.Rmd
├── 03-method.Rmd
├── 04-application.Rmd
├── 05-summary.Rmd
├── 06-references.Rmd
├── DESCRIPTION
├── Dockerfile
├── LICENSE
├── README.md
├── _bookdown.yml
├── _build.sh
├── _deploy.sh
├── _output.yml
├── book.bib
├── bookdown-github-actions-netlify.Rproj
├── index.Rmd
├── now.json
├── preamble.tex
├── renv.lock
├── renv
└── activate.R
├── style.css
└── toc.css
/.github/workflows/bookdown.yaml:
--------------------------------------------------------------------------------
1 | on:
2 | push:
3 | branches: master
4 |
5 | jobs:
6 | build:
7 | runs-on: macOS-latest
8 | steps:
9 | - name: Checkout repo
10 | uses: actions/checkout@master
11 |
12 | - name: Setup R
13 | uses: r-lib/actions/setup-r@master
14 |
15 | - name: Install pandoc
16 | run: |
17 | brew install pandoc
18 |
19 | - name: Cache Renv packages
20 | uses: actions/cache@v1
21 | with:
22 | path: $HOME/.local/share/renv
23 | key: r-${{ hashFiles('renv.lock') }}
24 | restore-keys: r-
25 |
26 | - name: Cache bookdown results
27 | uses: actions/cache@v1
28 | with:
29 | path: _bookdown_files
30 | key: bookdown-${{ hashFiles('**/*Rmd') }}
31 | restore-keys: bookdown-
32 |
33 | - name: Install packages
34 | run: |
35 | R -e 'install.packages("renv")'
36 | R -e 'renv::restore()'
37 |
38 | - name: Build site
39 | run: Rscript -e 'bookdown::render_book("index.Rmd", quiet = TRUE)'
40 |
41 | - name: Install npm
42 | uses: actions/setup-node@v1
43 |
44 | - name: Deploy to Netlify
45 | # NETLIFY_AUTH_TOKEN added in the repo's secrets
46 | env:
47 | NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
48 | NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
49 | run: |
50 | npm install netlify-cli -g
51 | netlify deploy --prod --dir _book
52 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .Rproj.user
2 | .Rhistory
3 | .RData
4 | _publish.R
5 | _book
6 | _bookdown_files
7 | rsconnect
8 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: r
2 | cache: packages
3 | pandoc_version: 1.19.2.1
4 |
5 | before_script:
6 | - chmod +x ./_build.sh
7 | - chmod +x ./_deploy.sh
8 |
9 | script:
10 | - ./_build.sh
11 | - ./_deploy.sh
12 |
--------------------------------------------------------------------------------
/01-intro.Rmd:
--------------------------------------------------------------------------------
1 | # Introduction {#intro}
2 |
3 | You can label chapter and section titles using `{#label}` after them, e.g., we can reference Chapter \@ref(intro). If you do not manually label them, there will be automatic labels anyway, e.g., Chapter \@ref(methods).
4 |
5 | Figures and tables with captions will be placed in `figure` and `table` environments, respectively.
6 |
7 | ```{r nice-fig, fig.cap='Here is a nice figure!', out.width='80%', fig.asp=.75, fig.align='center'}
8 | par(mar = c(4, 4, .1, .1))
9 | plot(pressure, type = 'b', pch = 19)
10 | ```
11 |
12 | Reference a figure by its code chunk label with the `fig:` prefix, e.g., see Figure \@ref(fig:nice-fig). Similarly, you can reference tables generated from `knitr::kable()`, e.g., see Table \@ref(tab:nice-tab).
13 |
14 | ```{r nice-tab, tidy=FALSE}
15 | knitr::kable(
16 | head(iris, 20), caption = 'Here is a nice table!',
17 | booktabs = TRUE
18 | )
19 | ```
20 |
21 | You can write citations, too. For example, we are using the **bookdown** package [@R-bookdown] in this sample book, which was built on top of R Markdown and **knitr** [@xie2015].
22 |
--------------------------------------------------------------------------------
/02-literature.Rmd:
--------------------------------------------------------------------------------
1 | # Literature
2 |
3 | Here is a review of existing methods.
4 |
--------------------------------------------------------------------------------
/03-method.Rmd:
--------------------------------------------------------------------------------
1 | # Methods
2 |
3 | We describe our methods in this chapter.
4 |
--------------------------------------------------------------------------------
/04-application.Rmd:
--------------------------------------------------------------------------------
1 | # Applications
2 |
3 | Some _significant_ applications are demonstrated in this chapter.
4 |
5 | ## Example one
6 |
7 | ## Example two
8 |
--------------------------------------------------------------------------------
/05-summary.Rmd:
--------------------------------------------------------------------------------
1 | # Final Words
2 |
3 | We have finished a nice book.
4 |
--------------------------------------------------------------------------------
/06-references.Rmd:
--------------------------------------------------------------------------------
1 | `r if (knitr:::is_html_output()) '
2 | # References {-}
3 | '`
4 |
--------------------------------------------------------------------------------
/DESCRIPTION:
--------------------------------------------------------------------------------
1 | Package: bookdown-github-actions-netlify
2 | Type: Book
3 | Title: Example of using Github Actions to deploy bookdown on Netlify
4 | Version: 0.0.1
5 | Imports: bookdown
6 | Remotes: rstudio/bookdown
7 | URL: https://github.com/EmilHvitfeldt/bookdown-github-actions-netlify
8 | BugReports: https://github.com/EmilHvitfeldt/bookdown-github-actions-netlify/issues
9 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM conoria/alpine-r-bookdown
2 |
3 | WORKDIR /usr/src
4 |
5 | COPY . .
6 |
7 | RUN R -q -e 'bookdown::render_book("index.Rmd", "bookdown::gitbook")' && mv _book /public
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | CC0 1.0 Universal
2 |
3 | Statement of Purpose
4 |
5 | The laws of most jurisdictions throughout the world automatically confer
6 | exclusive Copyright and Related Rights (defined below) upon the creator and
7 | subsequent owner(s) (each and all, an "owner") of an original work of
8 | authorship and/or a database (each, a "Work").
9 |
10 | Certain owners wish to permanently relinquish those rights to a Work for the
11 | purpose of contributing to a commons of creative, cultural and scientific
12 | works ("Commons") that the public can reliably and without fear of later
13 | claims of infringement build upon, modify, incorporate in other works, reuse
14 | and redistribute as freely as possible in any form whatsoever and for any
15 | purposes, including without limitation commercial purposes. These owners may
16 | contribute to the Commons to promote the ideal of a free culture and the
17 | further production of creative, cultural and scientific works, or to gain
18 | reputation or greater distribution for their Work in part through the use and
19 | efforts of others.
20 |
21 | For these and/or other purposes and motivations, and without any expectation
22 | of additional consideration or compensation, the person associating CC0 with a
23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
25 | and publicly distribute the Work under its terms, with knowledge of his or her
26 | Copyright and Related Rights in the Work and the meaning and intended legal
27 | effect of CC0 on those rights.
28 |
29 | 1. Copyright and Related Rights. A Work made available under CC0 may be
30 | protected by copyright and related or neighboring rights ("Copyright and
31 | Related Rights"). Copyright and Related Rights include, but are not limited
32 | to, the following:
33 |
34 | i. the right to reproduce, adapt, distribute, perform, display, communicate,
35 | and translate a Work;
36 |
37 | ii. moral rights retained by the original author(s) and/or performer(s);
38 |
39 | iii. publicity and privacy rights pertaining to a person's image or likeness
40 | depicted in a Work;
41 |
42 | iv. rights protecting against unfair competition in regards to a Work,
43 | subject to the limitations in paragraph 4(a), below;
44 |
45 | v. rights protecting the extraction, dissemination, use and reuse of data in
46 | a Work;
47 |
48 | vi. database rights (such as those arising under Directive 96/9/EC of the
49 | European Parliament and of the Council of 11 March 1996 on the legal
50 | protection of databases, and under any national implementation thereof,
51 | including any amended or successor version of such directive); and
52 |
53 | vii. other similar, equivalent or corresponding rights throughout the world
54 | based on applicable law or treaty, and any national implementations thereof.
55 |
56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of,
57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
59 | and Related Rights and associated claims and causes of action, whether now
60 | known or unknown (including existing as well as future claims and causes of
61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum
62 | duration provided by applicable law or treaty (including future time
63 | extensions), (iii) in any current or future medium and for any number of
64 | copies, and (iv) for any purpose whatsoever, including without limitation
65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
66 | the Waiver for the benefit of each member of the public at large and to the
67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver
68 | shall not be subject to revocation, rescission, cancellation, termination, or
69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work
70 | by the public as contemplated by Affirmer's express Statement of Purpose.
71 |
72 | 3. Public License Fallback. Should any part of the Waiver for any reason be
73 | judged legally invalid or ineffective under applicable law, then the Waiver
74 | shall be preserved to the maximum extent permitted taking into account
75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
76 | is so judged Affirmer hereby grants to each affected person a royalty-free,
77 | non transferable, non sublicensable, non exclusive, irrevocable and
78 | unconditional license to exercise Affirmer's Copyright and Related Rights in
79 | the Work (i) in all territories worldwide, (ii) for the maximum duration
80 | provided by applicable law or treaty (including future time extensions), (iii)
81 | in any current or future medium and for any number of copies, and (iv) for any
82 | purpose whatsoever, including without limitation commercial, advertising or
83 | promotional purposes (the "License"). The License shall be deemed effective as
84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the
85 | License for any reason be judged legally invalid or ineffective under
86 | applicable law, such partial invalidity or ineffectiveness shall not
87 | invalidate the remainder of the License, and in such case Affirmer hereby
88 | affirms that he or she will not (i) exercise any of his or her remaining
89 | Copyright and Related Rights in the Work or (ii) assert any associated claims
90 | and causes of action with respect to the Work, in either case contrary to
91 | Affirmer's express Statement of Purpose.
92 |
93 | 4. Limitations and Disclaimers.
94 |
95 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
96 | surrendered, licensed or otherwise affected by this document.
97 |
98 | b. Affirmer offers the Work as-is and makes no representations or warranties
99 | of any kind concerning the Work, express, implied, statutory or otherwise,
100 | including without limitation warranties of title, merchantability, fitness
101 | for a particular purpose, non infringement, or the absence of latent or
102 | other defects, accuracy, or the present or absence of errors, whether or not
103 | discoverable, all to the greatest extent permissible under applicable law.
104 |
105 | c. Affirmer disclaims responsibility for clearing rights of other persons
106 | that may apply to the Work or any use thereof, including without limitation
107 | any person's Copyright and Related Rights in the Work. Further, Affirmer
108 | disclaims responsibility for obtaining any necessary consents, permissions
109 | or other rights required for any use of the Work.
110 |
111 | d. Affirmer understands and acknowledges that Creative Commons is not a
112 | party to this document and has no duty or obligation with respect to this
113 | CC0 or use of the Work.
114 |
115 | For more information, please see
116 |
117 |
118 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://app.netlify.com/sites/bookdown-github-actions-netlify/deploys)
2 |
3 | Blog Post describing the process [here](https://www.emilhvitfeldt.com/post/bookdown-netlify-github-actions/)
4 |
5 | This is a minimal example of a book based on R Markdown and **bookdown** (https://github.com/rstudio/bookdown). Please see the page "[Get Started](https://bookdown.org/yihui/bookdown/get-started.html)" at https://bookdown.org/yihui/bookdown/ for how to compile this example into HTML. You may generate a copy of the book in `bookdown::pdf_book` format by calling `bookdown::render_book('index.Rmd', 'bookdown::pdf_book')`. More detailed instructions are available here https://bookdown.org/yihui/bookdown/build-the-book.html.
6 |
7 | You can find the preview of this example at https://bookdown.org/yihui/bookdown-demo/.
8 |
--------------------------------------------------------------------------------
/_bookdown.yml:
--------------------------------------------------------------------------------
1 | book_filename: "bookdown-demo"
2 | language:
3 | ui:
4 | chapter_name: "Chapter "
5 | delete_merged_file: true
6 |
--------------------------------------------------------------------------------
/_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | set -ev
4 |
5 | Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::gitbook')"
6 | Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::pdf_book')"
7 | Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::epub_book')"
8 |
9 |
--------------------------------------------------------------------------------
/_deploy.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | set -e
4 |
5 | [ -z "${GITHUB_PAT}" ] && exit 0
6 | [ "${TRAVIS_BRANCH}" != "master" ] && exit 0
7 |
8 | git config --global user.email "xie@yihui.name"
9 | git config --global user.name "Yihui Xie"
10 |
11 | git clone -b gh-pages https://${GITHUB_PAT}@github.com/${TRAVIS_REPO_SLUG}.git book-output
12 | cd book-output
13 | cp -r ../_book/* ./
14 | git add --all *
15 | git commit -m"Update the book" || true
16 | git push -q origin gh-pages
17 |
--------------------------------------------------------------------------------
/_output.yml:
--------------------------------------------------------------------------------
1 | bookdown::gitbook:
2 | css: style.css
3 | config:
4 | toc:
5 | before: |
6 |
A Minimal Book Example
7 | after: |
8 | Published with bookdown
9 | edit: https://github.com/rstudio/bookdown-demo/edit/master/%s
10 | download: ["pdf", "epub"]
11 | bookdown::pdf_book:
12 | includes:
13 | in_header: preamble.tex
14 | latex_engine: xelatex
15 | citation_package: natbib
16 | keep_tex: yes
17 | bookdown::epub_book: default
18 |
--------------------------------------------------------------------------------
/book.bib:
--------------------------------------------------------------------------------
1 | @Book{xie2015,
2 | title = {Dynamic Documents with {R} and knitr},
3 | author = {Yihui Xie},
4 | publisher = {Chapman and Hall/CRC},
5 | address = {Boca Raton, Florida},
6 | year = {2015},
7 | edition = {2nd},
8 | note = {ISBN 978-1498716963},
9 | url = {http://yihui.name/knitr/},
10 | }
11 |
--------------------------------------------------------------------------------
/bookdown-github-actions-netlify.Rproj:
--------------------------------------------------------------------------------
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: knitr
13 | LaTeX: pdfLaTeX
14 |
15 | AutoAppendNewline: Yes
16 | StripTrailingWhitespace: Yes
17 |
18 | BuildType: Website
19 |
--------------------------------------------------------------------------------
/index.Rmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "A Minimal Book Example"
3 | author: "Yihui Xie"
4 | date: "`r Sys.Date()`"
5 | site: bookdown::bookdown_site
6 | output: bookdown::gitbook
7 | documentclass: book
8 | bibliography: [book.bib, packages.bib]
9 | biblio-style: apalike
10 | link-citations: yes
11 | github-repo: rstudio/bookdown-demo
12 | description: "This is a minimal example of using the bookdown package to write a book. The output format for this example is bookdown::gitbook."
13 | ---
14 |
15 | # Prerequisites
16 |
17 | This is a _sample_ book written in **Markdown**. You can use anything that Pandoc's Markdown supports, e.g., a math equation $a^2 + b^2 = c^2$.
18 |
19 | The **bookdown** package can be installed from CRAN or Github:
20 |
21 | ```{r eval=FALSE}
22 | install.packages("bookdown")
23 | # or the development version
24 | # devtools::install_github("rstudio/bookdown")
25 | ```
26 |
27 | Remember each Rmd file contains one and only one chapter, and a chapter is defined by the first-level heading `#`.
28 |
29 | To compile this example to PDF, you need XeLaTeX. You are recommended to install TinyTeX (which includes XeLaTeX): .
30 |
31 | ```{r include=FALSE}
32 | # automatically create a bib database for R packages
33 | knitr::write_bib(c(
34 | .packages(), 'bookdown', 'knitr', 'rmarkdown'
35 | ), 'packages.bib')
36 | ```
37 |
--------------------------------------------------------------------------------
/now.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "static",
3 | "public": true
4 | }
5 |
--------------------------------------------------------------------------------
/preamble.tex:
--------------------------------------------------------------------------------
1 | \usepackage{booktabs}
2 | \usepackage{amsthm}
3 | \makeatletter
4 | \def\thm@space@setup{%
5 | \thm@preskip=8pt plus 2pt minus 4pt
6 | \thm@postskip=\thm@preskip
7 | }
8 | \makeatother
9 |
--------------------------------------------------------------------------------
/renv.lock:
--------------------------------------------------------------------------------
1 | {
2 | "R": {
3 | "Version": "3.6.0",
4 | "Repositories": [
5 | {
6 | "Name": "CRAN",
7 | "URL": "https://cran.rstudio.com"
8 | }
9 | ]
10 | },
11 | "Packages": {
12 | "Rcpp": {
13 | "Package": "Rcpp",
14 | "Version": "1.0.3",
15 | "Source": "Repository",
16 | "Repository": "CRAN",
17 | "Hash": "f3ca785924863b0e4c8cb23b6a5c75a1"
18 | },
19 | "base64enc": {
20 | "Package": "base64enc",
21 | "Version": "0.1-3",
22 | "Source": "Repository",
23 | "Repository": "CRAN",
24 | "Hash": "543776ae6848fde2f48ff3816d0628bc"
25 | },
26 | "bookdown": {
27 | "Package": "bookdown",
28 | "Version": "0.16",
29 | "Source": "Repository",
30 | "Repository": "CRAN",
31 | "Hash": "224429a9fded5e2933a6f4ce3568a743"
32 | },
33 | "digest": {
34 | "Package": "digest",
35 | "Version": "0.6.23",
36 | "Source": "Repository",
37 | "Repository": "CRAN",
38 | "Hash": "931fd68809dab4609b4d4b5702206066"
39 | },
40 | "evaluate": {
41 | "Package": "evaluate",
42 | "Version": "0.14",
43 | "Source": "Repository",
44 | "Repository": "CRAN",
45 | "Hash": "ec8ca05cffcc70569eaaad8469d2a3a7"
46 | },
47 | "glue": {
48 | "Package": "glue",
49 | "Version": "1.3.1",
50 | "Source": "Repository",
51 | "Repository": "CRAN",
52 | "Hash": "d4e25697c450c01b202c79ef35694a83"
53 | },
54 | "highr": {
55 | "Package": "highr",
56 | "Version": "0.8",
57 | "Source": "Repository",
58 | "Repository": "CRAN",
59 | "Hash": "4dc5bb88961e347a0f4d8aad597cbfac"
60 | },
61 | "htmltools": {
62 | "Package": "htmltools",
63 | "Version": "0.4.0",
64 | "Source": "Repository",
65 | "Repository": "CRAN",
66 | "Hash": "2d7691222f82f41e93f6d30f169bd5e1"
67 | },
68 | "jsonlite": {
69 | "Package": "jsonlite",
70 | "Version": "1.6",
71 | "Source": "Repository",
72 | "Repository": "CRAN",
73 | "Hash": "bc5739654d032acf531356e32e0d0f54"
74 | },
75 | "knitr": {
76 | "Package": "knitr",
77 | "Version": "1.26.1",
78 | "Source": "GitHub",
79 | "RemoteType": "github",
80 | "RemoteHost": "api.github.com",
81 | "RemoteRepo": "knitr",
82 | "RemoteUsername": "yihui",
83 | "RemoteRef": "master",
84 | "RemoteSha": "33d69c3acc0bb0a4f840e9ab836d0a4ec795c9fa",
85 | "Hash": "c84e06bbd8de820dec1f62414d2e18df"
86 | },
87 | "magrittr": {
88 | "Package": "magrittr",
89 | "Version": "1.5",
90 | "Source": "Repository",
91 | "Repository": "CRAN",
92 | "Hash": "1bb58822a20301cee84a41678e25d9b7"
93 | },
94 | "markdown": {
95 | "Package": "markdown",
96 | "Version": "1.1",
97 | "Source": "Repository",
98 | "Repository": "CRAN",
99 | "Hash": "61e4a10781dd00d7d81dd06ca9b94e95"
100 | },
101 | "mime": {
102 | "Package": "mime",
103 | "Version": "0.8",
104 | "Source": "Repository",
105 | "Repository": "CRAN",
106 | "Hash": "3d8abfab430c94a15e20eb91f052293f"
107 | },
108 | "renv": {
109 | "Package": "renv",
110 | "Version": "0.9.2",
111 | "Source": "Repository",
112 | "Repository": "CRAN",
113 | "Hash": "5181d5f316c7a6589219866d640e004c"
114 | },
115 | "rlang": {
116 | "Package": "rlang",
117 | "Version": "0.4.2.9001",
118 | "Source": "GitHub",
119 | "RemoteType": "github",
120 | "RemoteHost": "api.github.com",
121 | "RemoteRepo": "rlang",
122 | "RemoteUsername": "r-lib",
123 | "RemoteRef": "master",
124 | "RemoteSha": "afb5729eee3128ca1a64834021b638bad453594f",
125 | "Hash": "a038b091915d1c802b9f784faa661267"
126 | },
127 | "rmarkdown": {
128 | "Package": "rmarkdown",
129 | "Version": "2.0",
130 | "Source": "Repository",
131 | "Repository": "CRAN",
132 | "Hash": "745a60d9256842b1abae2dcf7b64ebc1"
133 | },
134 | "stringi": {
135 | "Package": "stringi",
136 | "Version": "1.4.5",
137 | "Source": "Repository",
138 | "Repository": "CRAN",
139 | "Hash": "ced3b63472796155f74abc4eb5266c78"
140 | },
141 | "stringr": {
142 | "Package": "stringr",
143 | "Version": "1.4.0.9000",
144 | "Source": "GitHub",
145 | "RemoteType": "github",
146 | "RemoteHost": "api.github.com",
147 | "RemoteRepo": "stringr",
148 | "RemoteUsername": "tidyverse",
149 | "RemoteRef": "master",
150 | "RemoteSha": "80aaaacdb47882f0f46507c1d99825a4c29c365e",
151 | "Hash": "1a78f1e8a34a62c3982585aa2c8baf15"
152 | },
153 | "tinytex": {
154 | "Package": "tinytex",
155 | "Version": "0.18",
156 | "Source": "Repository",
157 | "Repository": "CRAN",
158 | "Hash": "e2ce80882682180c2b5f86d2b47c9951"
159 | },
160 | "xfun": {
161 | "Package": "xfun",
162 | "Version": "0.11",
163 | "Source": "Repository",
164 | "Repository": "CRAN",
165 | "Hash": "9ec720c772e46177f8a78792939f4bef"
166 | },
167 | "yaml": {
168 | "Package": "yaml",
169 | "Version": "2.2.0",
170 | "Source": "Repository",
171 | "Repository": "CRAN",
172 | "Hash": "c78bdf1d16bd4ec7ecc86c6986d53309"
173 | }
174 | }
175 | }
176 |
--------------------------------------------------------------------------------
/renv/activate.R:
--------------------------------------------------------------------------------
1 |
2 | local({
3 |
4 | # the requested version of renv
5 | version <- "0.9.2"
6 |
7 | # avoid recursion
8 | if (!is.na(Sys.getenv("RENV_R_INITIALIZING", unset = NA)))
9 | return(invisible(TRUE))
10 |
11 | # signal that we're loading renv during R startup
12 | Sys.setenv("RENV_R_INITIALIZING" = "true")
13 | on.exit(Sys.unsetenv("RENV_R_INITIALIZING"), add = TRUE)
14 |
15 | # signal that we've consented to use renv
16 | options(renv.consent = TRUE)
17 |
18 | # load the 'utils' package eagerly -- this ensures that renv shims, which
19 | # mask 'utils' packages, will come first on the search path
20 | library(utils, lib.loc = .Library)
21 |
22 | # check to see if renv has already been loaded
23 | if ("renv" %in% loadedNamespaces()) {
24 |
25 | # if renv has already been loaded, and it's the requested version of renv,
26 | # nothing to do
27 | spec <- .getNamespaceInfo(.getNamespace("renv"), "spec")
28 | if (identical(spec[["version"]], version))
29 | return(invisible(TRUE))
30 |
31 | # otherwise, unload and attempt to load the correct version of renv
32 | unloadNamespace("renv")
33 |
34 | }
35 |
36 | # construct path to renv in library
37 | libpath <- local({
38 |
39 | root <- Sys.getenv("RENV_PATHS_LIBRARY", unset = "renv/library")
40 | prefix <- paste("R", getRversion()[1, 1:2], sep = "-")
41 |
42 | # include SVN revision for development versions of R
43 | # (to avoid sharing platform-specific artefacts with released versions of R)
44 | devel <-
45 | identical(R.version[["status"]], "Under development (unstable)") ||
46 | identical(R.version[["nickname"]], "Unsuffered Consequences")
47 |
48 | if (devel)
49 | prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r")
50 |
51 | file.path(root, prefix, R.version$platform)
52 |
53 | })
54 |
55 | # try to load renv from the project library
56 | if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) {
57 |
58 | # warn if the version of renv loaded does not match
59 | loadedversion <- utils::packageDescription("renv", fields = "Version")
60 | if (version != loadedversion) {
61 |
62 | # assume four-component versions are from GitHub; three-component
63 | # versions are from CRAN
64 | components <- strsplit(loadedversion, "[.-]")[[1]]
65 | remote <- if (length(components) == 4L)
66 | paste("rstudio/renv", loadedversion, sep = "@")
67 | else
68 | paste("renv", loadedversion, sep = "@")
69 |
70 | fmt <- paste(
71 | "renv %1$s was loaded from project library, but renv %2$s is recorded in lockfile.",
72 | "Use `renv::record(\"%3$s\")` to record this version in the lockfile.",
73 | "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.",
74 | sep = "\n"
75 | )
76 |
77 | msg <- sprintf(fmt, loadedversion, version, remote)
78 | warning(msg, call. = FALSE)
79 |
80 | }
81 |
82 | # load the project
83 | return(renv::load())
84 |
85 | }
86 |
87 | # failed to find renv locally; we'll try to install from GitHub.
88 | # first, set up download options as appropriate (try to use GITHUB_PAT)
89 | install_renv <- function() {
90 |
91 | message("Failed to find installation of renv -- attempting to bootstrap...")
92 |
93 | # ensure .Rprofile doesn't get executed
94 | rpu <- Sys.getenv("R_PROFILE_USER", unset = NA)
95 | Sys.setenv(R_PROFILE_USER = "")
96 | on.exit({
97 | if (is.na(rpu))
98 | Sys.unsetenv("R_PROFILE_USER")
99 | else
100 | Sys.setenv(R_PROFILE_USER = rpu)
101 | }, add = TRUE)
102 |
103 | # prepare download options
104 | pat <- Sys.getenv("GITHUB_PAT")
105 | if (nzchar(Sys.which("curl")) && nzchar(pat)) {
106 | fmt <- "--location --fail --header \"Authorization: token %s\""
107 | extra <- sprintf(fmt, pat)
108 | saved <- options("download.file.method", "download.file.extra")
109 | options(download.file.method = "curl", download.file.extra = extra)
110 | on.exit(do.call(base::options, saved), add = TRUE)
111 | } else if (nzchar(Sys.which("wget")) && nzchar(pat)) {
112 | fmt <- "--header=\"Authorization: token %s\""
113 | extra <- sprintf(fmt, pat)
114 | saved <- options("download.file.method", "download.file.extra")
115 | options(download.file.method = "wget", download.file.extra = extra)
116 | on.exit(do.call(base::options, saved), add = TRUE)
117 | }
118 |
119 | # fix up repos
120 | repos <- getOption("repos")
121 | on.exit(options(repos = repos), add = TRUE)
122 | repos[repos == "@CRAN@"] <- "https://cloud.r-project.org"
123 | options(repos = repos)
124 |
125 | # check for renv on CRAN matching this version
126 | db <- as.data.frame(available.packages(), stringsAsFactors = FALSE)
127 | if ("renv" %in% rownames(db)) {
128 | entry <- db["renv", ]
129 | if (identical(entry$Version, version)) {
130 | message("* Installing renv ", version, " ... ", appendLF = FALSE)
131 | dir.create(libpath, showWarnings = FALSE, recursive = TRUE)
132 | utils::install.packages("renv", lib = libpath, quiet = TRUE)
133 | message("Done!")
134 | return(TRUE)
135 | }
136 | }
137 |
138 | # try to download renv
139 | message("* Downloading renv ", version, " ... ", appendLF = FALSE)
140 | prefix <- "https://api.github.com"
141 | url <- file.path(prefix, "repos/rstudio/renv/tarball", version)
142 | destfile <- tempfile("renv-", fileext = ".tar.gz")
143 | on.exit(unlink(destfile), add = TRUE)
144 | utils::download.file(url, destfile = destfile, mode = "wb", quiet = TRUE)
145 | message("Done!")
146 |
147 | # attempt to install it into project library
148 | message("* Installing renv ", version, " ... ", appendLF = FALSE)
149 | dir.create(libpath, showWarnings = FALSE, recursive = TRUE)
150 |
151 | # invoke using system2 so we can capture and report output
152 | bin <- R.home("bin")
153 | exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R"
154 | r <- file.path(bin, exe)
155 | args <- c("--vanilla", "CMD", "INSTALL", "-l", shQuote(libpath), shQuote(destfile))
156 | output <- system2(r, args, stdout = TRUE, stderr = TRUE)
157 | message("Done!")
158 |
159 | # check for successful install
160 | status <- attr(output, "status")
161 | if (is.numeric(status) && !identical(status, 0L)) {
162 | text <- c("Error installing renv", "=====================", output)
163 | writeLines(text, con = stderr())
164 | }
165 |
166 |
167 | }
168 |
169 | try(install_renv())
170 |
171 | # try again to load
172 | if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) {
173 | message("Successfully installed and loaded renv ", version, ".")
174 | return(renv::load())
175 | }
176 |
177 | # failed to download or load renv; warn the user
178 | msg <- c(
179 | "Failed to find an renv installation: the project will not be loaded.",
180 | "Use `renv::activate()` to re-initialize the project."
181 | )
182 |
183 | warning(paste(msg, collapse = "\n"), call. = FALSE)
184 |
185 | })
186 |
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | p.caption {
2 | color: #777;
3 | margin-top: 10px;
4 | }
5 | p code {
6 | white-space: inherit;
7 | }
8 | pre {
9 | word-break: normal;
10 | word-wrap: normal;
11 | }
12 | pre code {
13 | white-space: inherit;
14 | }
15 |
--------------------------------------------------------------------------------
/toc.css:
--------------------------------------------------------------------------------
1 | #TOC ul,
2 | #TOC li,
3 | #TOC span,
4 | #TOC a {
5 | margin: 0;
6 | padding: 0;
7 | position: relative;
8 | }
9 | #TOC {
10 | line-height: 1;
11 | border-radius: 5px 5px 0 0;
12 | background: #141414;
13 | background: linear-gradient(to bottom, #333333 0%, #141414 100%);
14 | border-bottom: 2px solid #0fa1e0;
15 | width: auto;
16 | }
17 | #TOC:after,
18 | #TOC ul:after {
19 | content: '';
20 | display: block;
21 | clear: both;
22 | }
23 | #TOC a {
24 | background: #141414;
25 | background: linear-gradient(to bottom, #333333 0%, #141414 100%);
26 | color: #ffffff;
27 | display: block;
28 | padding: 19px 20px;
29 | text-decoration: none;
30 | text-shadow: none;
31 | }
32 | #TOC ul {
33 | list-style: none;
34 | }
35 | #TOC > ul > li {
36 | display: inline-block;
37 | float: left;
38 | margin: 0;
39 | }
40 | #TOC > ul > li > a {
41 | color: #ffffff;
42 | }
43 | #TOC > ul > li:hover:after {
44 | content: '';
45 | display: block;
46 | width: 0;
47 | height: 0;
48 | position: absolute;
49 | left: 50%;
50 | bottom: 0;
51 | border-left: 10px solid transparent;
52 | border-right: 10px solid transparent;
53 | border-bottom: 10px solid #0fa1e0;
54 | margin-left: -10px;
55 | }
56 | #TOC > ul > li:first-child > a {
57 | border-radius: 5px 0 0 0;
58 | }
59 | #TOC.align-right > ul > li:first-child > a,
60 | #TOC.align-center > ul > li:first-child > a {
61 | border-radius: 0;
62 | }
63 | #TOC.align-right > ul > li:last-child > a {
64 | border-radius: 0 5px 0 0;
65 | }
66 | #TOC > ul > li.active > a,
67 | #TOC > ul > li:hover > a {
68 | color: #ffffff;
69 | box-shadow: inset 0 0 3px #000000;
70 | background: #070707;
71 | background: linear-gradient(to bottom, #262626 0%, #070707 100%);
72 | }
73 | #TOC .has-sub {
74 | z-index: 1;
75 | }
76 | #TOC .has-sub:hover > ul {
77 | display: block;
78 | }
79 | #TOC .has-sub ul {
80 | display: none;
81 | position: absolute;
82 | width: 200px;
83 | top: 100%;
84 | left: 0;
85 | }
86 | #TOC .has-sub ul li a {
87 | background: #0fa1e0;
88 | border-bottom: 1px dotted #31b7f1;
89 | filter: none;
90 | display: block;
91 | line-height: 120%;
92 | padding: 10px;
93 | color: #ffffff;
94 | }
95 | #TOC .has-sub ul li:hover a {
96 | background: #0c7fb0;
97 | }
98 | #TOC ul ul li:hover > a {
99 | color: #ffffff;
100 | }
101 | #TOC .has-sub .has-sub:hover > ul {
102 | display: block;
103 | }
104 | #TOC .has-sub .has-sub ul {
105 | display: none;
106 | position: absolute;
107 | left: 100%;
108 | top: 0;
109 | }
110 | #TOC .has-sub .has-sub ul li a {
111 | background: #0c7fb0;
112 | border-bottom: 1px dotted #31b7f1;
113 | }
114 | #TOC .has-sub .has-sub ul li a:hover {
115 | background: #0a6d98;
116 | }
117 | #TOC ul ul li.last > a,
118 | #TOC ul ul li:last-child > a,
119 | #TOC ul ul ul li.last > a,
120 | #TOC ul ul ul li:last-child > a,
121 | #TOC .has-sub ul li:last-child > a,
122 | #TOC .has-sub ul li.last > a {
123 | border-bottom: 0;
124 | }
125 | #TOC ul {
126 | font-size: 1.2rem;
127 | }
128 |
--------------------------------------------------------------------------------