From 68d64fe8fba4300d1c6ab26498a1e2b65cdfa932 Mon Sep 17 00:00:00 2001 From: Simon Garnier Date: Thu, 24 Jan 2019 22:23:06 -0800 Subject: [PATCH] Updates package to 0.2. --- .Rbuildignore | 6 + .gitignore | 1 + .travis.yml | 58 ++ DESCRIPTION | 34 +- R/export_app.R | 21 +- R/list_apps.R | 202 +++-- R/list_categories.R | 22 +- R/list_keywords.R | 18 +- R/markdown.R | 79 ++ R/run_app.R | 25 +- README.md | 39 +- _pkgdown.yaml | 15 + appveyor.yml | 59 ++ docs/LICENSE-text.html | 826 ++++++++++++++++++ docs/apple-touch-icon-120x120.png | Bin 0 -> 6815 bytes docs/apple-touch-icon-152x152.png | Bin 0 -> 8963 bytes docs/apple-touch-icon-180x180.png | Bin 0 -> 10538 bytes docs/apple-touch-icon-60x60.png | Bin 0 -> 2772 bytes docs/apple-touch-icon-76x76.png | Bin 0 -> 3622 bytes docs/apple-touch-icon.png | Bin 0 -> 10538 bytes docs/articles/index.html | 158 ++++ docs/articles/z1_install.html | 162 ++++ docs/articles/z2_usage.html | 125 +++ docs/articles/z3_participate.html | 125 +++ docs/authors.html | 157 ++++ docs/docsearch.css | 148 ++++ docs/docsearch.js | 85 ++ docs/favicon-16x16.png | Bin 0 -> 998 bytes docs/favicon-32x32.png | Bin 0 -> 1537 bytes docs/favicon.ico | Bin 0 -> 15086 bytes docs/index.html | 178 ++++ docs/link.svg | 12 + docs/logo.svg | 23 + docs/pkgdown.css | 236 +++++ docs/pkgdown.js | 115 +++ docs/pkgdown.yml | 11 + docs/reference/export_app.html | 204 +++++ docs/reference/index.html | 203 +++++ docs/reference/list_apps.html | 212 +++++ docs/reference/list_categories.html | 185 ++++ docs/reference/list_keywords.html | 185 ++++ docs/reference/run_app.html | 206 +++++ docs/sitemap.xml | 30 + index.Rmd | 49 ++ inst/apps/aggregation_segregation/global.R | 0 inst/apps/aggregation_segregation/server.R | 0 inst/apps/aggregation_segregation/ui.R | 0 .../aggregation_segregation/www/actions.js | 0 .../www/white-rstudio-logo.png | Bin inst/{html => html_templates}/template.html | 2 +- logo.png | Bin 0 -> 10554 bytes logo.svg | 23 + man/export_app.Rd | 17 +- man/list_apps.Rd | 19 +- man/list_categories.Rd | 14 +- man/list_keywords.Rd | 14 +- man/run_app.Rd | 22 +- pkgdown/favicon/apple-touch-icon-120x120.png | Bin 0 -> 6815 bytes pkgdown/favicon/apple-touch-icon-152x152.png | Bin 0 -> 8963 bytes pkgdown/favicon/apple-touch-icon-180x180.png | Bin 0 -> 10538 bytes pkgdown/favicon/apple-touch-icon-60x60.png | Bin 0 -> 2772 bytes pkgdown/favicon/apple-touch-icon-76x76.png | Bin 0 -> 3622 bytes pkgdown/favicon/apple-touch-icon.png | Bin 0 -> 10538 bytes pkgdown/favicon/favicon-16x16.png | Bin 0 -> 998 bytes pkgdown/favicon/favicon-32x32.png | Bin 0 -> 1537 bytes pkgdown/favicon/favicon.ico | Bin 0 -> 15086 bytes vignettes/z1_install.R | 10 + vignettes/z1_install.Rmd | 50 ++ vignettes/z1_install.html | 135 +++ vignettes/z2_usage.Rmd | 10 + vignettes/z2_usage.html | 50 ++ vignettes/z3_participate.Rmd | 10 + vignettes/z3_participate.html | 50 ++ 73 files changed, 4417 insertions(+), 223 deletions(-) create mode 100644 .travis.yml create mode 100644 R/markdown.R create mode 100644 _pkgdown.yaml create mode 100644 appveyor.yml create mode 100644 docs/LICENSE-text.html create mode 100644 docs/apple-touch-icon-120x120.png create mode 100644 docs/apple-touch-icon-152x152.png create mode 100644 docs/apple-touch-icon-180x180.png create mode 100644 docs/apple-touch-icon-60x60.png create mode 100644 docs/apple-touch-icon-76x76.png create mode 100644 docs/apple-touch-icon.png create mode 100644 docs/articles/index.html create mode 100644 docs/articles/z1_install.html create mode 100644 docs/articles/z2_usage.html create mode 100644 docs/articles/z3_participate.html create mode 100644 docs/authors.html create mode 100644 docs/docsearch.css create mode 100644 docs/docsearch.js create mode 100644 docs/favicon-16x16.png create mode 100644 docs/favicon-32x32.png create mode 100644 docs/favicon.ico create mode 100644 docs/index.html create mode 100644 docs/link.svg create mode 100644 docs/logo.svg create mode 100644 docs/pkgdown.css create mode 100644 docs/pkgdown.js create mode 100644 docs/pkgdown.yml create mode 100644 docs/reference/export_app.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/list_apps.html create mode 100644 docs/reference/list_categories.html create mode 100644 docs/reference/list_keywords.html create mode 100644 docs/reference/run_app.html create mode 100644 docs/sitemap.xml create mode 100644 index.Rmd mode change 100755 => 100644 inst/apps/aggregation_segregation/global.R mode change 100755 => 100644 inst/apps/aggregation_segregation/server.R mode change 100755 => 100644 inst/apps/aggregation_segregation/ui.R mode change 100755 => 100644 inst/apps/aggregation_segregation/www/actions.js mode change 100755 => 100644 inst/apps/aggregation_segregation/www/white-rstudio-logo.png rename inst/{html => html_templates}/template.html (95%) create mode 100644 logo.png create mode 100644 logo.svg create mode 100644 pkgdown/favicon/apple-touch-icon-120x120.png create mode 100644 pkgdown/favicon/apple-touch-icon-152x152.png create mode 100644 pkgdown/favicon/apple-touch-icon-180x180.png create mode 100644 pkgdown/favicon/apple-touch-icon-60x60.png create mode 100644 pkgdown/favicon/apple-touch-icon-76x76.png create mode 100644 pkgdown/favicon/apple-touch-icon.png create mode 100644 pkgdown/favicon/favicon-16x16.png create mode 100644 pkgdown/favicon/favicon-32x32.png create mode 100644 pkgdown/favicon/favicon.ico create mode 100644 vignettes/z1_install.R create mode 100644 vignettes/z1_install.Rmd create mode 100644 vignettes/z1_install.html create mode 100644 vignettes/z2_usage.Rmd create mode 100644 vignettes/z2_usage.html create mode 100644 vignettes/z3_participate.Rmd create mode 100644 vignettes/z3_participate.html diff --git a/.Rbuildignore b/.Rbuildignore index 91114bf..4183b85 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,2 +1,8 @@ ^.*\.Rproj$ ^\.Rproj\.user$ +.travis.yml +_pkgdown.yaml +appveyor.yml +index.Rmd +logo.* +LICENSE \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0a74739..75d9756 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ src/*.o src/*.so src/*.dll +.DS_STORE \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..2238f6e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,58 @@ +language: R +sudo: false +cran: http://cran.rstudio.com +cache: packages +warnings_are_errors: false +os: + - linux + - osx + +r_build_args: "--no-manual --no-build-vignettes" +r_check_args: "--as-cran --ignore-vignettes --no-examples --install-args=--build" + +before_install: + - fname=travis_helpers.sh + - wget -O ${fname} http://bit.ly/travis_helpers + - cat ${fname}; source ${fname}; rm ${fname} + - cat DESCRIPTION + - export PACKAGE_NAME=`package_name` + - export RCHECK_DIR=${PACKAGE_NAME}.Rcheck + +after_success: + - cat ${RCHECK_DIR}/00install.out + - cat ${RCHECK_DIR}/00check.log + +after_failure: + - cat ${RCHECK_DIR}/00install.out + - cat ${RCHECK_DIR}/00check.log + +before_deploy: + - if [ "$TRAVIS_OS_NAME" = "osx" ]; + then + PKG_TARBALL=$(ls -1t *.tgz | head -n 1); + PKG_TARBALL_WITH_R=`echo $PKG_TARBALL | sed 's/.tgz/_'"R${rver}"'.tgz/'` ; + mv ${PKG_TARBALL} ${PKG_TARBALL_WITH_R} ; + echo "Built tarball is ${PKG_TARBALL_WITH_R}" ; + fi + - if [ "$TRAVIS_OS_NAME" = "linux" ]; + then + PKG_TARBALL=$(ls -1t *.tar.gz | head -n 1); + PKG_TARBALL_WITH_R=`echo $PKG_TARBALL | sed 's/.tar.gz/_'"R${rver}"'.tar.gz/'` ; + mv ${PKG_TARBALL} ${PKG_TARBALL_WITH_R} ; + echo "Built tarball is ${PKG_TARBALL_WITH_R}" ; + fi + - if [[ "${TRAVIS_OS_NAME}" = "osx" ]]; + then + rm -f *.tar.gz; + fi + +deploy: + provider: releases + skip_cleanup: true + api_key: + secure: pVFJPm5rdLijONI/LaVsoaUH0jUJm2DfRROO2RoQanpRWGK+3r56ZcE/lgFGiCjmKigQhbDVY6ld/6Zt9ODI7pNFlu5fuSd4nGjY3RNjXO82kNCTHMHD79NGfHriHRzuAkjV/ahs7Vzotr3G9CMjwT1cgTqwJ4K03zoenZfZlRq4UzqLbaTaUn1z1UMZEFP1s4rP3/KTNwCbDxXkPSE6WDVtO+k4oCxKz5saLWkshrbcyBY409KLZgNpjIiHFWdUEFyUqMV9mFZkwH3duIbNQlFLK1IietHgmed4In1jr5JuyMH53aqDyE7zwxZPVR+Ct/3Zs6hRgVZrPHl9edMX+UdUXz5RES5efGOM/uvOle3F3tTMLj3f2iR7QlJ8KA/LXI97mmpJo47OT/2KhJHZNw6tmHDMhcAhnT3HPGgZkUMKToMqUGL3DUcuZO0IZ4I34BkBuuxVWO5GNcOEi/HwAKpD/d1Pww7eMlPzr5lnqpjZYMcqp+dtiNT6TFnM39gLVViIDTTSmr7uosNq6n0XAt3JhS/MkoQHSxz1bAaDXNu8ZVsQsW1EiujfWDz6gYd553RpCClaVYxNUC2bqXVtLuZMcT1afjx8Z5alPMJArXZELhv/TfjvwHB4hivj/6zlmS1SknNgoLwfQD66SC9j5b76r/VhTGHKDMkDDaGPMLw= + file_glob: true + file: ${PACKAGE_NAME}*.t*gz + on: + repo: swarm-lab/${PACKAGE_NAME} + tags: true diff --git a/DESCRIPTION b/DESCRIPTION index 8bcb898..a42873b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,14 +1,28 @@ Package: teachR Type: Package -Title: TODO -Version: 0.1 -Date: 2015-05-13 -Author: Simon Garnier +Title: R Package For Distributing Web Applications For Educational Use +Version: 0.2 +Authors@R: c( + person("Simon", "Garnier", email = "garnier@njit.edu", role = c("aut", "cre"), + comment = c(ORCID = "0000-0002-3886-3974")) + ) Maintainer: Simon Garnier -Description: TODO -License: GPL (>= 3) +Description: teachR is a package for R that bundles several Shiny web + applications for educational use. The goal of teachR is to provide teachers + and educators with free, easy-to-use and interactive applications for + complementing their courses with virtual demonstrations and/or experiments. +License: GPL-3 Imports: - shiny (>= 0.11.1), - pacman (>= 0.4.1), - shinythemes (>= 1.1.1) -RoxygenNote: 5.0.1 + shiny (>= 1.2.0), + pacman (>= 0.5.0), + shinythemes (>= 1.1.2), + dplyr (>= 0.7.8), + markdown (>= 0.9), + mime (>= 0.6) +Suggests: + knitr +VignetteBuilder: knitr +URL: https://swarm-lab.github.io/teachR/, https://github.com/swarm-lab/teachR +BugReports: https://github.com/swarm-lab/teachR/issues +RoxygenNote: 6.1.1 +Encoding: UTF-8 diff --git a/R/export_app.R b/R/export_app.R index 0cdf98c..9821e28 100644 --- a/R/export_app.R +++ b/R/export_app.R @@ -1,25 +1,26 @@ -#' @title Export \code{\link[:-package]{teachR}} Apps +#' @title Export \code{teachR} Apps #' -#' @description This function expor a Shiny app provided by the -#' \code{\link[:-package]{teachR}} library to a local folder on +#' @description This function exports a Shiny app provided by the +#' \code{teachR} library to a local folder on #' a user's computer. Useful for modifying the app or running it on a Shiny #' Server instance for example. #' -#' @param app The name of the app to run. +#' @param app The name of the app to export. #' #' @param dest The destination of the app folder on the user's computer. A folder -#' with the name of the app will be created at this location. +#' with the name of the app will be created at this location. #' #' @return This function does not return anything. #' -#' @author Simon Garnier: \email{garnier@@njit.edu}, \link[https://twitter.com/sjmgarnier]{@@sjmgarnier} -#' +#' @author Simon Garnier, \email{garnier@@njit.edu} +#' #' @examples -#' # Export app to the current working directory -#' export_app("aggregation_segregation", ".") +#' \dontrun{ +#' # Export app to the current working directory +#' export_app("aggregation_segregation", ".") +#' } #' #' @export -#' export_app <- function(app, dest) { app_path <- paste0(find.package("teachR"), "/apps/", app) file.copy(from = app_path, to = dest, recursive = TRUE) diff --git a/R/list_apps.R b/R/list_apps.R index 502c6bf..5c12195 100644 --- a/R/list_apps.R +++ b/R/list_apps.R @@ -1,36 +1,37 @@ -#' @title List \code{\link[:-package]{teachR}} Apps +#' @title List \code{teachR} Apps #' #' @description This function generates a webpage listing all the apps available -#' through the \code{\link[:-package]{teachR}} library. The -#' list can be filtered by category (type \code{list_categories()} for a list -#' of existing categories) and keywords (type \code{list_keywords()} for a list -#' of existing keywords). +#' through the \code{teachR} library. The list can be filtered by category +#' (type \code{list_categories()} for a list of existing categories) and +#' keywords (type \code{list_keywords()} for a list of existing keywords). #' #' @param categories A character string or a vector of character strings -#' corresponding to existing app categories (case insensitive). +#' corresponding to existing app categories (case insensitive). #' #' @param keywords A character string or a vector of character strings -#' corresponding to existing app keywords (case insensitive). +#' corresponding to existing app keywords (case insensitive). #' #' @return This function opens an html file. #' -#' @author Simon Garnier: \email{garnier@@njit.edu}, \link[https://twitter.com/sjmgarnier]{@@sjmgarnier} +#' @author Simon Garnier, \email{garnier@@njit.edu} #' #' @details If called from RStudio, the list will open in the internal RStudio -#' viewer. If called from a terminal, it will open in your default internet browser. +#' viewer. If called from a terminal, it will open in your default internet +#' browser. #' #' @examples -#' list_apps(categories = c("biology", "social science")) +#' \dontrun{ +#' list_apps(categories = c("biology", "social science")) +#' } #' #' @export -#' list_apps <- function(categories=NULL, keywords=NULL) { apps <- dir(paste0(find.package("teachR"), "/apps")) info_table <- data.frame() for (i in 1:length(apps)) { - info <- read.table(paste0(find.package("teachR"), "/apps/", apps[i], "/info"), sep = ":") - info <- t(as.matrix(info)[,2]) + info <- utils::read.table(paste0(find.package("teachR"), "/apps/", apps[i], "/info"), sep = ":") + info <- t(as.matrix(info)[, 2]) info_table <- rbind(info_table, info) } info_table[] <- lapply(info_table, as.character) @@ -41,10 +42,10 @@ list_apps <- function(categories=NULL, keywords=NULL) { md <- .make_list(info_table, categories, keywords) tmp_file <- tempfile(pattern = "file", fileext = ".html") - out <- knit(text = md) - .markdownToHTML(text = out, output = tmp_file, options = c("toc"), - title = "Apps available in teachR", - template = paste0(find.package("teachR"), "/html/template.html")) + out <- knitr::knit(text = md) + markdown::markdownToHTML(text = out, output = tmp_file, options = c("toc"), + title = "Apps available in teachR", + template = paste0(find.package("teachR"), "/html_templates/template.html")) viewer <- getOption("viewer") if (!is.null(viewer)) @@ -55,22 +56,18 @@ list_apps <- function(categories=NULL, keywords=NULL) { .index <- function(x, pattern) { - pattern <- paste(tolower(pattern), collapse= "|") + pattern <- paste(tolower(pattern), collapse = "|") x <- tolower(x) grepl(pattern, x) } .make_list <- function(info_table, categories = NULL, keywords = NULL) { - require(dplyr) - require(knitr) - require(markdown) - if (!is.null(categories)) { - info_table <- filter(info_table, .index(Category, categories)) + info_table <- dplyr::filter(info_table, .index(Category, categories)) } if (!is.null(keywords)) { - info_table <- filter(info_table, .index(Keywords, keywords)) + info_table <- dplyr::filter(info_table, .index(Keywords, keywords)) } if (nrow(info_table) > 0) { @@ -81,7 +78,7 @@ list_apps <- function(categories=NULL, keywords=NULL) { category <- sub(" ", "", categories[i]) md <- c(md, paste0("### ", category)) - tmp <- filter(info_table, .index(Category, categories[i])) + tmp <- dplyr::filter(info_table, .index(Category, categories[i])) for (j in 1:nrow(tmp)) { md <- c(md, "") @@ -126,81 +123,80 @@ list_apps <- function(categories=NULL, keywords=NULL) { } -.markdownToHTML <- function(file, output = NULL, text = NULL, options = getOption("markdown.HTML.options"), - extensions = getOption("markdown.extensions"), title = "", - stylesheet = getOption("markdown.HTML.stylesheet"), - header = getOption("markdown.HTML.header"), - template = getOption("markdown.HTML.template"), fragment.only = FALSE, - encoding = getOption("encoding")) { - if (fragment.only) - options <- c(options, "fragment_only") - ret <- renderMarkdown(file, output = NULL, text, renderer = "HTML", - renderer.options = options, extensions = extensions, - encoding = encoding) - ret <- enc2native(ret) - if ("base64_images" %in% options) { - filedir <- if (!missing(file) && is.character(file) && - file.exists(file)) { - dirname(file) - } - else "." - ret <- local({ - oldwd <- setwd(filedir) - on.exit(setwd(oldwd)) - .b64EncodeImages(ret) - }) - } - if (!"fragment_only" %in% options) { - if (is.null(template)) - template <- system.file("resources", "markdown.html", - package = "markdown") - html <- paste(readLines(template), collapse = "\n") - html <- sub("#!html_output#", ret, html, fixed = TRUE) - if (is.character(stylesheet)) { - html <- sub("#!markdown_css#", markdown:::option2char(stylesheet), - html, fixed = TRUE) - } - else { - warning("stylesheet must either be valid CSS or a file containing CSS!") - } - html <- sub("#!header#", markdown:::option2char(header), html, fixed = TRUE) - if (!is.character(title) || title == "") { - m <- regexpr("<[Hh][1-6].*?>(.*)", - html, perl = TRUE) - if (m > -1) { - title <- regmatches(html, m) - title <- sub("<[Hh][1-6].*?>", "", title) - title <- sub("", "", title) - } - else { - title <- "" - } - } - html <- gsub("#!title#", title, html, fixed = TRUE) - if ("mathjax" %in% options && .requiresMathJax(html)) { - mathjax <- .mathJax(embed = "mathjax_embed" %in% - options) - } - else mathjax <- "" - html <- sub("#!mathjax#", mathjax, html, fixed = TRUE) - if ("highlight_code" %in% options && .requiresHighlighting(html)) { - highlight <- paste(readLines(system.file("resources", - "r_highlight.html", package = "markdown")), collapse = "\n") - } - else highlight <- "" - html <- sub("#!r_highlight#", highlight, html, fixed = TRUE) - ret <- html - } - if (is.character(output)) { - ret2 <- iconv(ret, to = "UTF-8") - if (any(is.na(ret2))) { - warning("failed to convert output to UTF-8; wrong input encoding or locale?") - } - else ret <- ret2 - writeLines(ret, output, useBytes = TRUE) - ret <- NULL - } - invisible(ret) -} - - +# .markdownToHTML <- function(file, output = NULL, text = NULL, +# options = getOption("markdown.HTML.options"), +# extensions = getOption("markdown.extensions"), title = "", +# stylesheet = getOption("markdown.HTML.stylesheet"), +# header = getOption("markdown.HTML.header"), +# template = getOption("markdown.HTML.template"), fragment.only = FALSE, +# encoding = getOption("encoding")) { +# if (fragment.only) +# options <- c(options, "fragment_only") +# ret <- markdown::renderMarkdown(file, output = NULL, text, renderer = "HTML", +# renderer.options = options, extensions = extensions, +# encoding = encoding) +# ret <- enc2native(ret) +# if ("base64_images" %in% options) { +# filedir <- if (!missing(file) && is.character(file) && +# file.exists(file)) { +# dirname(file) +# } +# else "." +# ret <- local({ +# oldwd <- setwd(filedir) +# on.exit(setwd(oldwd)) +# .b64EncodeImages(ret) +# }) +# } +# if (!"fragment_only" %in% options) { +# if (is.null(template)) +# template <- system.file("resources", "markdown.html", +# package = "markdown") +# html <- paste(readLines(template), collapse = "\n") +# html <- sub("#!html_output#", ret, html, fixed = TRUE) +# if (is.character(stylesheet)) { +# html <- sub("#!markdown_css#", option2char(stylesheet), +# html, fixed = TRUE) +# } +# else { +# warning("stylesheet must either be valid CSS or a file containing CSS!") +# } +# html <- sub("#!header#", option2char(header), html, fixed = TRUE) +# if (!is.character(title) || title == "") { +# m <- regexpr("<[Hh][1-6].*?>(.*)", +# html, perl = TRUE) +# if (m > -1) { +# title <- regmatches(html, m) +# title <- sub("<[Hh][1-6].*?>", "", title) +# title <- sub("", "", title) +# } +# else { +# title <- "" +# } +# } +# html <- gsub("#!title#", title, html, fixed = TRUE) +# if ("mathjax" %in% options && .requiresMathJax(html)) { +# mathjax <- .mathJax(embed = "mathjax_embed" %in% +# options) +# } +# else mathjax <- "" +# html <- sub("#!mathjax#", mathjax, html, fixed = TRUE) +# if ("highlight_code" %in% options && .requiresHighlighting(html)) { +# highlight <- paste(readLines(system.file("resources", +# "r_highlight.html", package = "markdown")), collapse = "\n") +# } +# else highlight <- "" +# html <- sub("#!r_highlight#", highlight, html, fixed = TRUE) +# ret <- html +# } +# if (is.character(output)) { +# ret2 <- iconv(ret, to = "UTF-8") +# if (any(is.na(ret2))) { +# warning("failed to convert output to UTF-8; wrong input encoding or locale?") +# } +# else ret <- ret2 +# writeLines(ret, output, useBytes = TRUE) +# ret <- NULL +# } +# invisible(ret) +# } diff --git a/R/list_categories.R b/R/list_categories.R index 050f161..f0a2e58 100644 --- a/R/list_categories.R +++ b/R/list_categories.R @@ -1,26 +1,26 @@ -#' @title List Categories of All \code{\link[:-package]{teachR}} Apps +#' @title List Categories of All \code{teachR} Apps #' #' @description This function generates a listing of all the categories of apps -#' available through the \code{\link[:-package]{teachR}} -#' library. +#' available through the \code{teachR} library. #' #' @return A vector of character strings, each of them corresponding to a different -#' category. +#' category. #' -#' @author Simon Garnier: \email{garnier@@njit.edu}, \link[https://twitter.com/sjmgarnier]{@@sjmgarnier} +#' @author Simon Garnier, \email{garnier@@njit.edu} #' #' @examples -#' list_categories() +#' \dontrun{ +#' list_categories() +#' } #' #' @export -#' list_categories <- function() { apps <- dir(paste0(find.package("teachR"), "/apps")) info_table <- data.frame() for (i in 1:length(apps)) { - info <- read.table(paste0(find.package("teachR"), "/apps/", apps[i], "/info"), sep = ":") - info <- t(as.matrix(info)[,2]) + info <- utils::read.table(paste0(find.package("teachR"), "/apps/", apps[i], "/info"), sep = ":") + info <- t(as.matrix(info)[, 2]) info_table <- rbind(info_table, info) } info_table[] <- lapply(info_table, as.character) @@ -32,7 +32,3 @@ list_categories <- function() { categories <- sort(unique(unlist(categories))) sub(" ", "", categories) } - - - - diff --git a/R/list_keywords.R b/R/list_keywords.R index 03c3a0d..e8b5f3b 100644 --- a/R/list_keywords.R +++ b/R/list_keywords.R @@ -1,26 +1,26 @@ -#' @title List Keywords of All \code{\link[:-package]{teachR}} Apps +#' @title List Keywords of All \code{teachR} Apps #' #' @description This function generates a listing of all the keywords of apps -#' available through the \code{\link[:-package]{teachR}} -#' library. +#' available through the \code{teachR} library. #' #' @return A vector of character strings, each of them corresponding to a different -#' keyword. +#' keyword. #' -#' @author Simon Garnier: \email{garnier@@njit.edu}, \link[https://twitter.com/sjmgarnier]{@@sjmgarnier} +#' @author Simon Garnier, \email{garnier@@njit.edu} #' #' @examples -#' list_keywords() +#' \dontrun{ +#' list_keywords() +#' } #' #' @export -#' list_keywords <- function() { apps <- dir(paste0(find.package("teachR"), "/apps")) info_table <- data.frame() for (i in 1:length(apps)) { - info <- read.table(paste0(find.package("teachR"), "/apps/", apps[i], "/info"), sep = ":") - info <- t(as.matrix(info)[,2]) + info <- utils::read.table(paste0(find.package("teachR"), "/apps/", apps[i], "/info"), sep = ":") + info <- t(as.matrix(info)[, 2]) info_table <- rbind(info_table, info) } info_table[] <- lapply(info_table, as.character) diff --git a/R/markdown.R b/R/markdown.R new file mode 100644 index 0000000..37ad134 --- /dev/null +++ b/R/markdown.R @@ -0,0 +1,79 @@ +#' # Functions copied from the markdown package +#' .mathJax <- local({ +#' js <- NULL +#' +#' function(embed=FALSE, force=FALSE) { +#' if (!embed) +#' return(paste(readLines(system.file( +#' 'resources', 'mathjax.html', package = 'markdown' +#' )), collapse = '\n')) +#' +#' url <- 'https://cdn.bootcss.com/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML' +#' +#' # Insert or link to MathJax script? +#' html <- c('', if (embed) { +#' # Already in cache? +#' if (force || is.null(js)) { +#' js <<- readLines(url, warn = FALSE) +#' } +#' c('') +#' +#' paste(html, collapse = "\n") +#' } +#' }) +#' +#' +#' .requiresMathJax <- function(html) { +#' regs <- c("\\\\\\(([\\s\\S]+?)\\\\\\)", "\\\\\\[([\\s\\S]+?)\\\\\\]") +#' for (i in regs) if (any(grepl(i, html, perl = TRUE))) +#' return(TRUE) +#' FALSE +#' } +#' +#' .requiresHighlighting <- function(html) { +#' any(grepl("
:-package]{teachR}} Apps
+#' @title Run \code{teachR} Apps
 #'
 #' @description This function calls a Shiny app provided by the 
-#'  \code{\link[:-package]{teachR}} library. The list of 
-#'  available Shiny apps can be obtained by typing \code{list_apps()} in your R 
-#'  terminal. 
+#'  \code{teachR} library. The list of available Shiny apps can be obtained by 
+#'  typing \code{list_apps()} in your R terminal. 
 #' 
 #' @param app The name of the app to run.
 #' 
 #' @return This function does not return anything.
 #' 
-#' @author Simon Garnier: \email{garnier@@njit.edu}, \link[https://twitter.com/sjmgarnier]{@@sjmgarnier}
+#' @author Simon Garnier, \email{garnier@@njit.edu}
 #' 
 #' @details If called from RStudio, the app will open in the internal RStudio 
-#' internet browser. If called from a terminal, it will open in your default 
-#' internet browser. All apps should work without any problem with the internal 
-#' RStudio internet browser, as well as with recent versions of most internet 
-#' browsers. It is likely to break with older versions.
+#'  internet browser. If called from a terminal, it will open in your default 
+#'  internet browser. All apps should work without any problem with the internal 
+#'  RStudio internet browser, as well as with recent versions of most internet 
+#'  browsers. It is likely to break with older versions.
 #' 
 #' @examples
-#' run_app("aggregation_segregation")
+#' \dontrun{
+#'  run_app("aggregation_segregation")
+#' }
 #' 
 #' @export
-#'
 run_app <- function(app) {
-  require(shiny)
   app_path <- paste0(find.package("teachR"), "/apps/", app)
-  runApp(app_path)
+  shiny::runApp(app_path)
 }
 
diff --git a/README.md b/README.md
index 6ee97d0..2c77a8a 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,14 @@
-teachR
-======
+# teachR - R package for distributing web applications for educational use 
+
+[![Travis-CI Build Status](https://travis-ci.org/swarm-lab/teachR.svg?branch=master)](https://travis-ci.org/swarm-lab/teachR)
+[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/swarm-lab/teachR?branch=master&svg=true)](https://ci.appveyor.com/project/swarm-lab/teachR)
+
+**Please submit all suggestions and bug reports 
+[here](https://github.com/swarm-lab/teachR/issues). Thanks!**
+
+---
+
+## Description 
 
 `teachR` is a package for [`R`](http://www.r-project.org) that bundles several 
 [`Shiny`](http://shiny.rstudio.com/) web applications for educational use. 
@@ -16,8 +25,8 @@ on [`shinyapp.io`](https://www.shinyapps.io/) or on a personal
 
 The `teachR` package is at a very early stage of development. It contains only a 
 few [`Shiny`](http://shiny.rstudio.com/) applications at the moment, but this 
-number is meant to grow with the help [`Shiny`](http://shiny.rstudio.com/) 
-developers willing to make their educational web applications more easily 
+number is meant to grow with the help of [`Shiny`](http://shiny.rstudio.com/) 
+developers looking to make their educational web applications more easily 
 accessible. 
 
 If you are a [`Shiny`](http://shiny.rstudio.com/) developer and want to 
@@ -27,24 +36,10 @@ send me a pull request.
 
 ---
 
-#### Installation
-Installing `teachR` from this GitHub repository is pretty straightforward: 
-simply copy the following lines of code in your R terminal: 
+## Quick start guides
 
-```{r}
-if (!require("devtools")) install.packages("devtools")
-devtools::install_github("swarm-lab/teachR")
-
-library(teachR)
-```
-
-Use the package's help to learn how to discover and run the applications provided
-in `teachR`. 
+1. [Installing teachR](https://swarm-lab.github.io/teachR/articles/z1_install)
+2. [Using teachR](https://swarm-lab.github.io/ROpenCVLite/articles/z2_usage.html)
+3. [Adding new apps to teachR](https://swarm-lab.github.io/ROpenCVLite/articles/z3_participate.html)
 
 ---
-
-#### Maintainer(s)
-Simon Garnier - [@sjmgarnier](https://twitter.com/sjmgarnier) - 
-
-
----
\ No newline at end of file
diff --git a/_pkgdown.yaml b/_pkgdown.yaml
new file mode 100644
index 0000000..79c81ea
--- /dev/null
+++ b/_pkgdown.yaml
@@ -0,0 +1,15 @@
+url: https://swarm-lab.github.io/teachR/
+
+template:
+  params:
+    bootswatch: yeti
+#    docsearch:
+#      api_key: 3a2946bbe34c635ad2e2aae74a83374b
+#      index_name: swarm-lab-swarm
+
+authors:
+  Simon Garnier:
+    href: http://www.theswarmlab.com
+
+development:
+  mode: unreleased
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..a4aaa5e
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,59 @@
+# DO NOT CHANGE
+init:
+  ps: |
+    $ErrorActionPreference = "Stop"
+    Invoke-WebRequest http://raw.github.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "..\appveyor-tool.ps1"
+    Import-Module '..\appveyor-tool.ps1'
+
+install:
+  ps: Bootstrap
+
+cache:
+  - C:\RLibrary
+
+
+# Adapt as necessary starting from here
+environment:
+  global:
+    WARNINGS_ARE_ERRORS: 0.0
+    USE_RTOOLS: yes
+    R_CHECK_INSTALL_ARGS: --install-args=--build
+
+  matrix:
+  - R_VERSION: stable
+    RTOOLS_VERSION: 34
+    CRAN: http://cran.rstudio.com
+
+build_script:
+  - travis-tool.sh install_deps
+
+test_script:
+  - travis-tool.sh run_tests
+
+on_failure:
+  - 7z a failure.zip *.Rcheck\*
+  - appveyor PushArtifact failure.zip
+
+artifacts:
+  - path: '*.Rcheck\**\*.log'
+    name: Logs
+  - path: '*.Rcheck\**\*.out'
+    name: Logs
+  - path: '*.Rcheck\**\*.fail'
+    name: Logs
+  - path: '*.Rcheck\**\*.Rout'
+    name: Logs
+  - path: '\*_*.tar.gz'
+    name: Bits
+  - path: '\*_*.zip'
+    name: Bits
+
+deploy:
+  provider: GitHub
+  description: Windows Binary
+  auth_token:
+    secure: h+8/Q2kGkLoaoZ8OEtsplJGXuPFhS/VQbtE66cMJj7J3PeDgNAROVkV7368h3s+b
+  draft: no
+  prerelease: no
+  on:
+    APPVEYOR_REPO_TAG: true
diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html
new file mode 100644
index 0000000..75f2cf4
--- /dev/null
+++ b/docs/LICENSE-text.html
@@ -0,0 +1,826 @@
+
+
+
+  
+  
+
+
+
+License • teachR
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  
+
+  
+    
+
+ + + +
+ +
+
+ + +
GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    {one line to give the program's name and a brief idea of what it does.}
+    Copyright (C) {year}  {name of author}
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    {project}  Copyright (C) {year}  {fullname}
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+ +
+ +
+ + + +
+ + + + + + diff --git a/docs/apple-touch-icon-120x120.png b/docs/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..6965c81830fa7271f7f8dbc00dc54043ca57edd9 GIT binary patch literal 6815 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 C&yh+1 literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-152x152.png b/docs/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..d199cc475270bbd09dfeeaa3c54255f231b0ce7d GIT binary patch literal 8963 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 SAe@0_0Z>!YM${?TApZx=DUrbd literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon-180x180.png b/docs/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3724ad4ab7a3d8b8cc88348c05b04560787771 GIT binary patch literal 10538 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 aN-hBE7ZG&wLN%2D0000nA^?QL0pKSN0CdR! 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 literal 0 HcmV?d00001 diff --git a/docs/apple-touch-icon.png b/docs/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a50d8dda625a256e36c589741fa0355ab724310a GIT binary patch literal 10538 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 + + + + + + + +Articles • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+
+ + + +
+
+ + +
+ + + + + + diff --git a/docs/articles/z1_install.html b/docs/articles/z1_install.html new file mode 100644 index 0000000..13d18d3 --- /dev/null +++ b/docs/articles/z1_install.html @@ -0,0 +1,162 @@ + + + + + + + +1 - Installing teachR • teachR + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +

This page describes the installation process of teachR.

+

teachR has not been released on CRAN yet, but it can be easily installed from its GitHub repository with the following steps.

+
+ +
+
+

+1.1 - Before installing

+

Before installing teachR, you will need to install the latest version of the devtools package. You can install devtools from CRAN as follows:

+
if (!require(devtools))
+  install.packages("devtools")
+
+
+
+

+1.2 - Installing teachR

+

You can install teachR as follows:

+
devtools::install_github("swarm-lab/teachR")
+
+
+
+

+1.3 - Loading teachR

+
library(teachR)
+
+
+ + + +
+ + + +
+ + + + + diff --git a/docs/articles/z2_usage.html b/docs/articles/z2_usage.html new file mode 100644 index 0000000..15e18fb --- /dev/null +++ b/docs/articles/z2_usage.html @@ -0,0 +1,125 @@ + + + + + + + +1 - Installing teachR • teachR + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +

This page describes how to use teachR.

+
+ + + +
+ + + +
+ + + + + diff --git a/docs/articles/z3_participate.html b/docs/articles/z3_participate.html new file mode 100644 index 0000000..e94d138 --- /dev/null +++ b/docs/articles/z3_participate.html @@ -0,0 +1,125 @@ + + + + + + + +1 - Installing teachR • teachR + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +

This page describes how to add apps to teachR.

+
+ + + +
+ + + +
+ + + + + diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 0000000..354a47b --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,157 @@ + + + + + + + + +Authors • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+
+ + + + +
+ +
+ + + +
+ + + + + + diff --git a/docs/docsearch.css b/docs/docsearch.css new file mode 100644 index 0000000..e5f1fe1 --- /dev/null +++ b/docs/docsearch.css @@ -0,0 +1,148 @@ +/* Docsearch -------------------------------------------------------------- */ +/* + Source: https://github.com/algolia/docsearch/ + License: MIT +*/ + +.algolia-autocomplete { + display: block; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.algolia-autocomplete .ds-dropdown-menu { + width: 100%; + min-width: none; + max-width: none; + padding: .75rem 0; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .1); + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .175); +} + +@media (min-width:768px) { + .algolia-autocomplete .ds-dropdown-menu { + width: 175% + } +} + +.algolia-autocomplete .ds-dropdown-menu::before { + display: none +} + +.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-] { + padding: 0; + background-color: rgb(255,255,255); + border: 0; + max-height: 80vh; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestions { + margin-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion { + padding: 0; + overflow: visible +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header { + padding: .125rem 1rem; + margin-top: 0; + font-size: 1.3em; + font-weight: 500; + color: #00008B; + border-bottom: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--wrapper { + float: none; + padding-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { + float: none; + width: auto; + padding: 0; + text-align: left +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content { + float: none; + width: auto; + padding: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content::before { + display: none +} + +.algolia-autocomplete .ds-suggestion:not(:first-child) .algolia-docsearch-suggestion--category-header { + padding-top: .75rem; + margin-top: .75rem; + border-top: 1px solid rgba(0, 0, 0, .1) +} + +.algolia-autocomplete .ds-suggestion .algolia-docsearch-suggestion--subcategory-column { + display: block; + padding: .1rem 1rem; + margin-bottom: 0.1; + font-size: 1.0em; + font-weight: 400 + /* display: none */ +} + +.algolia-autocomplete .algolia-docsearch-suggestion--title { + display: block; + padding: .25rem 1rem; + margin-bottom: 0; + font-size: 0.9em; + font-weight: 400 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--text { + padding: 0 1rem .5rem; + margin-top: -.25rem; + font-size: 0.8em; + font-weight: 400; + line-height: 1.25 +} + +.algolia-autocomplete .algolia-docsearch-footer { + width: 110px; + height: 20px; + z-index: 3; + margin-top: 10.66667px; + float: right; + font-size: 0; + line-height: 0; +} + +.algolia-autocomplete .algolia-docsearch-footer--logo { + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; + overflow: hidden; + text-indent: -9000px; + width: 100%; + height: 100%; + display: block; + transform: translate(-8px); +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + color: #FF8C00; + background: rgba(232, 189, 54, 0.1) +} + + +.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + box-shadow: inset 0 -2px 0 0 rgba(105, 105, 105, .5) +} + +.algolia-autocomplete .ds-suggestion.ds-cursor .algolia-docsearch-suggestion--content { + background-color: rgba(192, 192, 192, .15) +} diff --git a/docs/docsearch.js b/docs/docsearch.js new file mode 100644 index 0000000..b35504c --- /dev/null +++ b/docs/docsearch.js @@ -0,0 +1,85 @@ +$(function() { + + // register a handler to move the focus to the search bar + // upon pressing shift + "/" (i.e. "?") + $(document).on('keydown', function(e) { + if (e.shiftKey && e.keyCode == 191) { + e.preventDefault(); + $("#search-input").focus(); + } + }); + + $(document).ready(function() { + // do keyword highlighting + /* modified from https://jsfiddle.net/julmot/bL6bb5oo/ */ + var mark = function() { + + var referrer = document.URL ; + var paramKey = "q" ; + + if (referrer.indexOf("?") !== -1) { + var qs = referrer.substr(referrer.indexOf('?') + 1); + var qs_noanchor = qs.split('#')[0]; + var qsa = qs_noanchor.split('&'); + var keyword = ""; + + for (var i = 0; i < qsa.length; i++) { + var currentParam = qsa[i].split('='); + + if (currentParam.length !== 2) { + continue; + } + + if (currentParam[0] == paramKey) { + keyword = decodeURIComponent(currentParam[1].replace(/\+/g, "%20")); + } + } + + if (keyword !== "") { + $(".contents").unmark({ + done: function() { + $(".contents").mark(keyword); + } + }); + } + } + }; + + mark(); + }); +}); + +/* Search term highlighting ------------------------------*/ + +function matchedWords(hit) { + var words = []; + + var hierarchy = hit._highlightResult.hierarchy; + // loop to fetch from lvl0, lvl1, etc. + for (var idx in hierarchy) { + words = words.concat(hierarchy[idx].matchedWords); + } + + var content = hit._highlightResult.content; + if (content) { + words = words.concat(content.matchedWords); + } + + // return unique words + var words_uniq = [...new Set(words)]; + return words_uniq; +} + +function updateHitURL(hit) { + + var words = matchedWords(hit); + var url = ""; + + if (hit.anchor) { + url = hit.url_without_anchor + '?q=' + escape(words.join(" ")) + '#' + hit.anchor; + } else { + url = hit.url + '?q=' + escape(words.join(" ")); + } + + return url; +} diff --git a/docs/favicon-16x16.png b/docs/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..2f05615d012418b5f93140aa79a65a60ee6044f0 GIT binary patch literal 998 zcmZ`$ZA_bG6n*-EK%oqwp97ZiIiMda4b4V12&APHO2gd2ZCUF!OU=9#y8IB=j#E|I^BFR(|eEI1QZ*uR+J-H_*C-;*Q zjgn3~NJ9wGRRwY_fsy+iLLp|V@IWa6)YG}exd?eKhV7OI5j)RRpe;tIIR&AXR)qd0 zsFvRldRvUpmJuP@R|v5!owrZCj1UPcQR@`MffMk404wy5L02!hhQKib-96yy0Jj71 zt1$3B4C8=Xp|1@*1{l}F_{R>^Wd>TA7NAkzQZub0)Gn3Ww{>4;{F)iABX!>29^{00&@3UK1`+$1YWxN zSUIw)9DSm`y_W4=Rg65*j;#yb0R>FPIQ^*u%Yy5V1o*tDXFAnB#qXZtJAOKZ`_o{S z4NDx?qXTvA)ObEMK|tlD(+Z8O?zuFWV}qY-6fV_ zOjWE1-XL*E8l>EW+in$IbTn8}zzk5!gqRWegU6#+;h&d3sq zGlUYUPJC1*$&g9Kd~t?MEWW}p^Zp|+pQ)^^Zu)=0rfRX15S(h(=`n5jJ3LFnnd;iQ zDjwEksp8dIFcU(Jog3TXA@wIyQ>Ttk�bi5hXE9WD1K;j4t|;L5b$cTQcueQW9_K oc+-J}`x7%0u@k}5Ed};M5!zzEh;8RdFB29>rO?O+^Nb(<3t(B1(*OVf literal 0 HcmV?d00001 diff --git a/docs/favicon-32x32.png b/docs/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..24639e910a7f7a8b891ccff795f34d7c951ab3c4 GIT binary patch literal 1537 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 literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..10a1d8c --- /dev/null +++ b/docs/index.html @@ -0,0 +1,178 @@ + + + + + + + +R Package For Distributing Web Applications For Educational Use • teachR + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + + + +
+ + +

Please submit all suggestions and bug reports here. Thanks!

+
+
+

+Description +

+

teachR is a package for R that bundles several Shiny web applications for educational use.

+

The goal of teachR is to provide teachers and educators with free, easy-to-use and interactive applications for complementing their courses with virtual demonstrations and/or experiments.

+

The Shiny applications in teachR can be launched directly from within R or RStudio. They can also be exported toward a local folder for later deployment on shinyapp.io or on a personal Shiny Server instance.

+

The teachR package is at a very early stage of development. It contains only a few Shiny applications at the moment, but this number is meant to grow with the help of Shiny developers looking to make their educational web applications more easily accessible.

+

If you are a Shiny developer and want to participate, just fork this repository, add your application(s) to the “inst/apps” folder with a properly formatted “info” file (see other apps for examples), and send me a pull request.

+
+
+
+

+Quick start guides

+
    +
  1. Installing teachR
  2. +
  3. Using teachR
  4. +
  5. Adding new apps to teachR
  6. +
+
+
+
+
+ + + +
+ + + +
+ + + + + diff --git a/docs/link.svg b/docs/link.svg new file mode 100644 index 0000000..88ad827 --- /dev/null +++ b/docs/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/logo.svg b/docs/logo.svg new file mode 100644 index 0000000..65fab7e --- /dev/null +++ b/docs/logo.svg @@ -0,0 +1,23 @@ + + + + + + + teachR + + + + + diff --git a/docs/pkgdown.css b/docs/pkgdown.css new file mode 100644 index 0000000..c03fb08 --- /dev/null +++ b/docs/pkgdown.css @@ -0,0 +1,236 @@ +/* Sticky footer */ + +/** + * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/ + * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css + * + * .Site -> body > .container + * .Site-content -> body > .container .row + * .footer -> footer + * + * Key idea seems to be to ensure that .container and __all its parents__ + * have height set to 100% + * + */ + +html, body { + height: 100%; +} + +body > .container { + display: flex; + height: 100%; + flex-direction: column; + + padding-top: 60px; +} + +body > .container .row { + flex: 1 0 auto; +} + +footer { + margin-top: 45px; + padding: 35px 0 36px; + border-top: 1px solid #e5e5e5; + color: #666; + display: flex; + flex-shrink: 0; +} +footer p { + margin-bottom: 0; +} +footer div { + flex: 1; +} +footer .pkgdown { + text-align: right; +} +footer p { + margin-bottom: 0; +} + +img.icon { + float: right; +} + +img { + max-width: 100%; +} + +/* Fix bug in bootstrap (only seen in firefox) */ +summary { + display: list-item; +} + +/* Typographic tweaking ---------------------------------*/ + +.contents .page-header { + margin-top: calc(-60px + 1em); +} + +/* Section anchors ---------------------------------*/ + +a.anchor { + margin-left: -30px; + display:inline-block; + width: 30px; + height: 30px; + visibility: hidden; + + background-image: url(./link.svg); + background-repeat: no-repeat; + background-size: 20px 20px; + background-position: center center; +} + +.hasAnchor:hover a.anchor { + visibility: visible; +} + +@media (max-width: 767px) { + .hasAnchor:hover a.anchor { + visibility: hidden; + } +} + + +/* Fixes for fixed navbar --------------------------*/ + +.contents h1, .contents h2, .contents h3, .contents h4 { + padding-top: 60px; + margin-top: -40px; +} + +/* Static header placement on mobile devices */ +@media (max-width: 767px) { + .navbar-fixed-top { + position: absolute; + } + .navbar { + padding: 0; + } +} + + +/* Sidebar --------------------------*/ + +#sidebar { + margin-top: 30px; +} +#sidebar h2 { + font-size: 1.5em; + margin-top: 1em; +} + +#sidebar h2:first-child { + margin-top: 0; +} + +#sidebar .list-unstyled li { + margin-bottom: 0.5em; +} + +.orcid { + height: 16px; + vertical-align: middle; +} + +/* Reference index & topics ----------------------------------------------- */ + +.ref-index th {font-weight: normal;} + +.ref-index td {vertical-align: top;} +.ref-index .icon {width: 40px;} +.ref-index .alias {width: 40%;} +.ref-index-icons .alias {width: calc(40% - 40px);} +.ref-index .title {width: 60%;} + +.ref-arguments th {text-align: right; padding-right: 10px;} +.ref-arguments th, .ref-arguments td {vertical-align: top;} +.ref-arguments .name {width: 20%;} +.ref-arguments .desc {width: 80%;} + +/* Nice scrolling for wide elements --------------------------------------- */ + +table { + display: block; + overflow: auto; +} + +/* Syntax highlighting ---------------------------------------------------- */ + +pre { + word-wrap: normal; + word-break: normal; + border: 1px solid #eee; +} + +pre, code { + background-color: #f8f8f8; + color: #333; +} + +pre code { + overflow: auto; + word-wrap: normal; + white-space: pre; +} + +pre .img { + margin: 5px 0; +} + +pre .img img { + background-color: #fff; + display: block; + height: auto; +} + +code a, pre a { + color: #375f84; +} + +a.sourceLine:hover { + text-decoration: none; +} + +.fl {color: #1514b5;} +.fu {color: #000000;} /* function */ +.ch,.st {color: #036a07;} /* string */ +.kw {color: #264D66;} /* keyword */ +.co {color: #888888;} /* comment */ + +.message { color: black; font-weight: bolder;} +.error { color: orange; font-weight: bolder;} +.warning { color: #6A0366; font-weight: bolder;} + +/* Clipboard --------------------------*/ + +.hasCopyButton { + position: relative; +} + +.btn-copy-ex { + position: absolute; + right: 0; + top: 0; + visibility: hidden; +} + +.hasCopyButton:hover button.btn-copy-ex { + visibility: visible; +} + +/* mark.js ----------------------------*/ + +mark { + background-color: rgba(255, 255, 51, 0.5); + border-bottom: 2px solid rgba(255, 153, 51, 0.3); + padding: 1px; +} + +/* vertical spacing after htmlwidgets */ +.html-widget { + margin-bottom: 10px; +} diff --git a/docs/pkgdown.js b/docs/pkgdown.js new file mode 100644 index 0000000..eb7e83d --- /dev/null +++ b/docs/pkgdown.js @@ -0,0 +1,115 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $("#sidebar") + .stick_in_parent({offset_top: 40}) + .on('sticky_kit:bottom', function(e) { + $(this).parent().css('position', 'static'); + }) + .on('sticky_kit:unbottom', function(e) { + $(this).parent().css('position', 'relative'); + }); + + $('body').scrollspy({ + target: '#sidebar', + offset: 60 + }); + + $('[data-toggle="tooltip"]').tooltip(); + + var cur_path = paths(location.pathname); + var links = $("#navbar ul li a"); + var max_length = -1; + var pos = -1; + for (var i = 0; i < links.length; i++) { + if (links[i].getAttribute("href") === "#") + continue; + // Ignore external links + if (links[i].host !== location.host) + continue; + + var nav_path = paths(links[i].pathname); + + var length = prefix_length(nav_path, cur_path); + if (length > max_length) { + max_length = length; + pos = i; + } + } + + // Add class to parent
  • , and enclosing
  • if in dropdown + if (pos >= 0) { + var menu_anchor = $(links[pos]); + menu_anchor.parent().addClass("active"); + menu_anchor.closest("li.dropdown").addClass("active"); + } + }); + + function paths(pathname) { + var pieces = pathname.split("/"); + pieces.shift(); // always starts with / + + var end = pieces[pieces.length - 1]; + if (end === "index.html" || end === "") + pieces.pop(); + return(pieces); + } + + // Returns -1 if not found + function prefix_length(needle, haystack) { + if (needle.length > haystack.length) + return(-1); + + // Special case for length-0 haystack, since for loop won't run + if (haystack.length === 0) { + return(needle.length === 0 ? 0 : -1); + } + + for (var i = 0; i < haystack.length; i++) { + if (needle[i] != haystack[i]) + return(i); + } + + return(haystack.length); + } + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-original-title'); + element.setAttribute('data-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $(".examples, div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent; + } + }); + + clipboardBtnCopies.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboardBtnCopies.on('error', function() { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + }); + } +})(window.jQuery || window.$) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml new file mode 100644 index 0000000..3fe4226 --- /dev/null +++ b/docs/pkgdown.yml @@ -0,0 +1,11 @@ +pandoc: 1.19.2.1 +pkgdown: 1.3.0 +pkgdown_sha: ~ +articles: + z1_install: z1_install.html + z2_usage: z2_usage.html + z3_participate: z3_participate.html +urls: + reference: https://swarm-lab.github.io/teachR//reference + article: https://swarm-lab.github.io/teachR//articles + diff --git a/docs/reference/export_app.html b/docs/reference/export_app.html new file mode 100644 index 0000000..4e6917d --- /dev/null +++ b/docs/reference/export_app.html @@ -0,0 +1,204 @@ + + + + + + + + +Export <code>teachR</code> Apps — export_app • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    This function exports a Shiny app provided by the + teachR library to a local folder on + a user's computer. Useful for modifying the app or running it on a Shiny + Server instance for example.

    + +
    + +
    export_app(app, dest)
    + +

    Arguments

    +
  • + + + + + + + + + +
    app

    The name of the app to export.

    dest

    The destination of the app folder on the user's computer. A folder +with the name of the app will be created at this location.

    + +

    Value

    + +

    This function does not return anything.

    + + +

    Examples

    +
    # NOT RUN {
    + # Export app to the current working directory
    + export_app("aggregation_segregation", ".")
    +# }
    +
    + + + + + + + + + + + + diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 0000000..6c7a1f8 --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,203 @@ + + + + + + + + +Function reference • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    All functions

    +

    +
    +

    export_app()

    +

    Export teachR Apps

    +

    list_apps()

    +

    List teachR Apps

    +

    list_categories()

    +

    List Categories of All teachR Apps

    +

    list_keywords()

    +

    List Keywords of All teachR Apps

    +

    run_app()

    +

    Run teachR Apps

    +
    + + +
    + + +
    + + + + + + diff --git a/docs/reference/list_apps.html b/docs/reference/list_apps.html new file mode 100644 index 0000000..2c6bdbf --- /dev/null +++ b/docs/reference/list_apps.html @@ -0,0 +1,212 @@ + + + + + + + + +List <code>teachR</code> Apps — list_apps • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    This function generates a webpage listing all the apps available + through the teachR library. The list can be filtered by category + (type list_categories() for a list of existing categories) and + keywords (type list_keywords() for a list of existing keywords).

    + +
    + +
    list_apps(categories = NULL, keywords = NULL)
    + +

    Arguments

    + + + + + + + + + + +
    categories

    A character string or a vector of character strings +corresponding to existing app categories (case insensitive).

    keywords

    A character string or a vector of character strings +corresponding to existing app keywords (case insensitive).

    + +

    Value

    + +

    This function opens an html file.

    + +

    Details

    + +

    If called from RStudio, the list will open in the internal RStudio + viewer. If called from a terminal, it will open in your default internet + browser.

    + + +

    Examples

    +
    # NOT RUN {
    + list_apps(categories = c("biology", "social science"))
    +# }
    +
    +
    + +
    + + +
    + + + + + + diff --git a/docs/reference/list_categories.html b/docs/reference/list_categories.html new file mode 100644 index 0000000..e557f4a --- /dev/null +++ b/docs/reference/list_categories.html @@ -0,0 +1,185 @@ + + + + + + + + +List Categories of All <code>teachR</code> Apps — list_categories • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    This function generates a listing of all the categories of apps + available through the teachR library.

    + +
    + +
    list_categories()
    + +

    Value

    + +

    A vector of character strings, each of them corresponding to a different + category.

    + + +

    Examples

    +
    # NOT RUN {
    + list_categories()
    +# }
    +
    +
    + +
    + + +
    + + + + + + diff --git a/docs/reference/list_keywords.html b/docs/reference/list_keywords.html new file mode 100644 index 0000000..1a7a8d0 --- /dev/null +++ b/docs/reference/list_keywords.html @@ -0,0 +1,185 @@ + + + + + + + + +List Keywords of All <code>teachR</code> Apps — list_keywords • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    This function generates a listing of all the keywords of apps + available through the teachR library.

    + +
    + +
    list_keywords()
    + +

    Value

    + +

    A vector of character strings, each of them corresponding to a different + keyword.

    + + +

    Examples

    +
    # NOT RUN {
    + list_keywords()
    +# }
    +
    +
    + +
    + + +
    + + + + + + diff --git a/docs/reference/run_app.html b/docs/reference/run_app.html new file mode 100644 index 0000000..246327a --- /dev/null +++ b/docs/reference/run_app.html @@ -0,0 +1,206 @@ + + + + + + + + +Run <code>teachR</code> Apps — run_app • teachR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    This function calls a Shiny app provided by the + teachR library. The list of available Shiny apps can be obtained by + typing list_apps() in your R terminal.

    + +
    + +
    run_app(app)
    + +

    Arguments

    + + + + + + +
    app

    The name of the app to run.

    + +

    Value

    + +

    This function does not return anything.

    + +

    Details

    + +

    If called from RStudio, the app will open in the internal RStudio + internet browser. If called from a terminal, it will open in your default + internet browser. All apps should work without any problem with the internal + RStudio internet browser, as well as with recent versions of most internet + browsers. It is likely to break with older versions.

    + + +

    Examples

    +
    # NOT RUN {
    + run_app("aggregation_segregation")
    +# }
    +
    +
    + +
    + + +
    + + + + + + diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 0000000..4ab8557 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,30 @@ + + + + https://swarm-lab.github.io/teachR//index.html + + + https://swarm-lab.github.io/teachR//reference/export_app.html + + + https://swarm-lab.github.io/teachR//reference/list_apps.html + + + https://swarm-lab.github.io/teachR//reference/list_categories.html + + + https://swarm-lab.github.io/teachR//reference/list_keywords.html + + + https://swarm-lab.github.io/teachR//reference/run_app.html + + + https://swarm-lab.github.io/teachR//articles/z1_install.html + + + https://swarm-lab.github.io/teachR//articles/z2_usage.html + + + https://swarm-lab.github.io/teachR//articles/z3_participate.html + + diff --git a/index.Rmd b/index.Rmd new file mode 100644 index 0000000..585a1ea --- /dev/null +++ b/index.Rmd @@ -0,0 +1,49 @@ +--- +output: github_document +--- + +# teachR - R package for distributing web applications for educational use + +[![Travis-CI Build Status](https://travis-ci.org/swarm-lab/teachR.svg?branch=master)](https://travis-ci.org/swarm-lab/teachR) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/swarm-lab/teachR?branch=master&svg=true)](https://ci.appveyor.com/project/swarm-lab/teachR) + +**Please submit all suggestions and bug reports +[here](https://github.com/swarm-lab/teachR/issues). Thanks!** + +--- + +## Description + +`teachR` is a package for [`R`](http://www.r-project.org) that bundles several +[`Shiny`](http://shiny.rstudio.com/) web applications for educational use. + +The goal of `teachR` is to provide teachers and educators with free, easy-to-use +and interactive applications for complementing their courses with virtual +demonstrations and/or experiments. + +The [`Shiny`](http://shiny.rstudio.com/) applications in `teachR` can be launched +directly from within [`R`](http://www.r-project.org) or [`RStudio`](http://www.rstudio.com). +They can also be exported toward a local folder for later deployment +on [`shinyapp.io`](https://www.shinyapps.io/) or on a personal +[`Shiny Server`](http://www.rstudio.com/products/shiny/shiny-server/) instance. + +The `teachR` package is at a very early stage of development. It contains only a +few [`Shiny`](http://shiny.rstudio.com/) applications at the moment, but this +number is meant to grow with the help of [`Shiny`](http://shiny.rstudio.com/) +developers looking to make their educational web applications more easily +accessible. + +If you are a [`Shiny`](http://shiny.rstudio.com/) developer and want to +participate, just fork this repository, add your application(s) to the "inst/apps" +folder with a properly formatted "info" file (see other apps for examples), and +send me a pull request. + +--- + +## Quick start guides + +1. [Installing teachR](https://swarm-lab.github.io/teachR/articles/z1_install) +2. [Using teachR](https://swarm-lab.github.io/ROpenCVLite/articles/z2_usage.html) +3. [Adding new apps to teachR](https://swarm-lab.github.io/ROpenCVLite/articles/z3_participate.html) + +--- diff --git a/inst/apps/aggregation_segregation/global.R b/inst/apps/aggregation_segregation/global.R old mode 100755 new mode 100644 diff --git a/inst/apps/aggregation_segregation/server.R b/inst/apps/aggregation_segregation/server.R old mode 100755 new mode 100644 diff --git a/inst/apps/aggregation_segregation/ui.R b/inst/apps/aggregation_segregation/ui.R old mode 100755 new mode 100644 diff --git a/inst/apps/aggregation_segregation/www/actions.js b/inst/apps/aggregation_segregation/www/actions.js old mode 100755 new mode 100644 diff --git a/inst/apps/aggregation_segregation/www/white-rstudio-logo.png b/inst/apps/aggregation_segregation/www/white-rstudio-logo.png old mode 100755 new mode 100644 diff --git a/inst/html/template.html b/inst/html_templates/template.html similarity index 95% rename from inst/html/template.html rename to inst/html_templates/template.html index 245655d..007bd72 100644 --- a/inst/html/template.html +++ b/inst/html_templates/template.html @@ -3,7 +3,7 @@ -#!title# +Apps available in teachR + + + + + + + + + + + + +

    1 - Installing teachR

    + + + +

    This page describes the installation process of teachR.

    +

    teachR has not been released on CRAN yet, but it can be easily installed from its GitHub repository with the following steps.

    +
    + +
    +
    +

    1.1 - Before installing

    +

    Before installing teachR, you will need to install the latest version of the devtools package. You can install devtools from CRAN as follows:

    +
    if (!require(devtools))
    +  install.packages("devtools")
    +
    +
    +
    +

    1.2 - Installing teachR

    +

    You can install teachR as follows:

    +
    devtools::install_github("swarm-lab/teachR")
    +
    +
    +
    +

    1.3 - Loading teachR

    +
    library(teachR)
    +
    + + + + + + + + diff --git a/vignettes/z2_usage.Rmd b/vignettes/z2_usage.Rmd new file mode 100644 index 0000000..730ed18 --- /dev/null +++ b/vignettes/z2_usage.Rmd @@ -0,0 +1,10 @@ +--- +title: "1 - Installing teachR" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{pkgdown} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +__This page describes how to use [`teachR`](https://github.com/swarm-lab/teachR).__ diff --git a/vignettes/z2_usage.html b/vignettes/z2_usage.html new file mode 100644 index 0000000..b8bf453 --- /dev/null +++ b/vignettes/z2_usage.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + +1 - Installing teachR + + + + + + + + + + + + + + + +

    1 - Installing teachR

    + + + +

    This page describes how to use teachR.

    + + + + + + + + diff --git a/vignettes/z3_participate.Rmd b/vignettes/z3_participate.Rmd new file mode 100644 index 0000000..67d0917 --- /dev/null +++ b/vignettes/z3_participate.Rmd @@ -0,0 +1,10 @@ +--- +title: "1 - Installing teachR" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{pkgdown} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +__This page describes how to add apps to [`teachR`](https://github.com/swarm-lab/teachR).__ diff --git a/vignettes/z3_participate.html b/vignettes/z3_participate.html new file mode 100644 index 0000000..d70b8a4 --- /dev/null +++ b/vignettes/z3_participate.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + +1 - Installing teachR + + + + + + + + + + + + + + + +

    1 - Installing teachR

    + + + +

    This page describes how to add apps to teachR.

    + + + + + + + +