blob: 4cea729c9d6c2b55be6ea161a98e3d008e4f3965 [file] [log] [blame]
# 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"),
echo = TRUE, ask = getOption("demo.ask"),
encoding = getOption("encoding"))
{
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.
## 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)
}
## now figure out if the package has an encoding
pkgpath <- dirname(dirname(available))
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 <Return> to start : ")
}
source(available, echo = echo, max.deparse.length = Inf,
keep.source = TRUE, encoding = encoding)
}