├── .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 | [![Netlify Status](https://api.netlify.com/api/v1/badges/022fd0de-6e47-434c-8ef7-8bc304c7407b/deploy-status)](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 | --------------------------------------------------------------------------------