# File src/library/utils/R/demo.R # Part of the R package, https://www.R-project.org # # Copyright (C) 1995-2014 The R Core Team # # 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 2 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. # # A copy of the GNU General Public License is available at # https://www.R-project.org/Licenses/ demo <- function(topic, package = NULL, lib.loc = NULL, character.only = FALSE, verbose = getOption("verbose"), type = c("console", "html"), echo = TRUE, ask = getOption("demo.ask"), encoding = getOption("encoding")) { type <- match.arg(type) html <- type == "html" ## only two options for now if (html) { enhancedHTML <- str2logical(Sys.getenv("_R_HELP_ENABLE_ENHANCED_HTML_", "TRUE")) ## silently ignore (but note in documentation) if (!interactive() || !enhancedHTML || !requireNamespace("knitr", quietly = TRUE)) html <- FALSE } if (html) { port <- tools::startDynamicHelp(NA) if (port <= 0L) html <- FALSE # silently fall back to console output else { if (!is.null(lib.loc)) lib.loc <- NULL browser <- if (.Platform$GUI == "AQUA") { get("aqua.browser", envir = as.environment("tools:RGUI")) } else getOption("browser") } } paths <- find.package(package, lib.loc, verbose = verbose) ## Find the directories with a 'demo' subdirectory. paths <- paths[dir.exists(file.path(paths, "demo"))] ## Earlier versions remembered given packages with no 'demo' ## subdirectory, and warned about them. if(missing(topic)) { ## List all possible demos. if (html) { browseURL(paste0("http://127.0.0.1:", port, "/doc/html/Search?package=", paste(unique(basename(paths)), collapse=";"), "&agrep=0&types.demo=1&pattern="), browser) return(invisible()) } ## else ## Build the demo db. db <- matrix(character(), nrow = 0L, ncol = 4L) for(path in paths) { entries <- NULL ## Check for new-style 'Meta/demo.rds', then for '00Index'. if(file_test("-f", INDEX <- file.path(path, "Meta", "demo.rds"))) { entries <- readRDS(INDEX) } if(NROW(entries)) { db <- rbind(db, cbind(basename(path), dirname(path), entries)) } } colnames(db) <- c("Package", "LibPath", "Item", "Title") footer <- if(missing(package)) paste0("Use ", sQuote(paste("demo(package =", ".packages(all.available = TRUE))")), "\n", "to list the demos in all *available* packages.") else NULL y <- list(title = "Demos", header = NULL, results = db, footer = footer) class(y) <- "packageIQR" return(y) } if(!character.only) { topic <- substitute(topic) if (is.call(topic) && (topic[[1L]] == "::" || topic[[1L]] == ":::")) { package <- as.character(topic[[2L]]) topic <- as.character(topic[[3L]]) } else topic <- as.character(topic) } available <- character() paths <- file.path(paths, "demo") for(p in paths) { files <- basename(tools::list_files_with_type(p, "demo")) ## Files with base names sans extension matching topic files <- files[topic == tools::file_path_sans_ext(files)] if(length(files)) available <- c(available, file.path(p, files)) } if(length(available) == 0L) stop(gettextf("No demo found for topic %s", sQuote(topic)), domain = NA) if(length(available) > 1L) { available <- available[1L] warning(gettextf("Demo for topic %s' found more than once,\nusing the one found in %s", sQuote(topic), sQuote(dirname(available[1L]))), domain = NA) } pkgpath <- dirname(dirname(available)) if (html) { browseURL(paste0("http://127.0.0.1:", port, "/library/", basename(pkgpath), "/Demo/", tools::file_path_sans_ext(basename(available))), browser) return(invisible()) } ## else ## now figure out if the package has an encoding if (file.exists(file <- file.path(pkgpath, "Meta", "package.rds"))) { desc <- readRDS(file)$DESCRIPTION if (length(desc) == 1L) { enc <- as.list(desc)[["Encoding"]] !if(!is.null(enc)) encoding <- enc } } if(ask == "default") ask <- echo && grDevices::dev.interactive(orNone = TRUE) if(.Device != "null device") { oldask <- grDevices::devAskNewPage(ask = ask) on.exit(grDevices::devAskNewPage(oldask), add = TRUE) } op <- options(device.ask.default = ask) on.exit(options(op), add = TRUE) if (echo) { cat("\n\n", "\tdemo(", topic, ")\n", "\t---- ", rep.int("~", nchar(topic, type = "w")), "\n", sep = "") if(ask && interactive()) readline("\nType to start : ") } source(available, echo = echo, max.deparse.length = Inf, keep.source = TRUE, encoding = encoding) }