blob: 6a6a3743076ff62d112870f848581d6045a3b74a [file] [log] [blame]
# File src/library/utils/R/sessionInfo.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2019 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/
.RNGdefaults <- RNGkind() # run once at install time and retain for comparison
## FIXME? alternatively, just define 'osVersion' directly in .onLoad() in zzz.R
.osVersion <- function() {
## Now try to figure out the OS we are running under
if (.Platform$OS.type == "windows") {
win.version()
} else if (nzchar(Sys.which('uname'))) { ## we could try /usr/bin/uname
uname <- system("uname -a", intern = TRUE)
os <- sub(" .*", "", uname)
switch(os,
"Linux" =
if(file.exists("/etc/os-release")) {
## http://www.freedesktop.org/software/systemd/man/os-release.html
tmp <- readLines("/etc/os-release")
t2 <- if (any(startsWith(tmp, "PRETTY_NAME=")))
sub("^PRETTY_NAME=", "",
grep("^PRETTY_NAME=", tmp, value = TRUE)[1L])
else if (any(startsWith(tmp, "NAME")))
## could check for VERSION or VERSION_ID
sub("^NAME=", "",
grep("^NAME=", tmp, value = TRUE)[1L])
else "Linux (unknown distro)"
sub('"(.*)"', "\\1", t2)
} else if(file.exists("/etc/system-release")) {
## RHEL-like
readLines("/etc/system-release")
},
"Darwin" = {
ver <- readLines("/System/Library/CoreServices/SystemVersion.plist")
ind <- grep("ProductUserVisibleVersion", ver)
ver <- ver[ind + 1L]
ver <- sub(".*<string>", "", ver)
ver <- sub("</string>$", "", ver)
ver1 <- strsplit(ver, ".", fixed = TRUE)[[1L]][2L]
sprintf("%s %s %s",
ifelse(as.numeric(ver1) < 12, "OS X", "macOS"),
switch(ver1,
## 10.6 is earliest that can be installed
"6" = "Snow Leopard",
"7" = "Lion",
"8" = "Mountain Lion",
"9" = "Mavericks",
"10" = "Yosemite",
"11" = "El Capitan",
"12" = "Sierra",
"13" = "High Sierra",
"14" = "Mojave",
"15" = "Catalina",
""), ver)
},
"SunOS" = {
ver <- system('uname -r', intern = TRUE)
paste("Solaris",
strsplit(ver, ".", fixed = TRUE)[[1L]][2L])
},
uname)
} # using system('uname ..')
## else NULL
}
sessionInfo <- function(package = NULL)
{
z <- list()
z$R.version <- R.Version()
z$platform <- z$R.version$platform
if(nzchar(.Platform$r_arch))
z$platform <- paste(z$platform, .Platform$r_arch, sep = "/")
z$platform <- paste0(z$platform, " (", 8*.Machine$sizeof.pointer, "-bit)")
z$locale <- Sys.getlocale()
z$running <- osVersion
z$RNGkind <- RNGkind()
if(is.null(package)){
package <- grep("^package:", search(), value=TRUE)
# weed out environments which are not really packages
keep <- vapply(package, function(x) x == "package:base"
|| !is.null(attr(as.environment(x), "path")), NA)
package <- .rmpkg(package[keep])
}
## no need to re-encode given what we extract.
pkgDesc <- lapply(package, packageDescription, encoding = NA)
if(length(package) == 0) stop("no valid packages were specified")
basePkgs <- sapply(pkgDesc,
function(x) !is.null(x$Priority) && x$Priority=="base")
## Hmm, see tools:::.get_standard_package_names()$base
z$basePkgs <- package[basePkgs]
if(any(!basePkgs)){
z$otherPkgs <- pkgDesc[!basePkgs]
names(z$otherPkgs) <- package[!basePkgs]
}
loadedOnly <- loadedNamespaces()
loadedOnly <- loadedOnly[!(loadedOnly %in% package)]
if (length(loadedOnly)) {
names(loadedOnly) <- loadedOnly
pkgDesc <- c(pkgDesc, lapply(loadedOnly, packageDescription))
z$loadedOnly <- pkgDesc[loadedOnly]
}
z$matprod <- as.character(options("matprod"))
es <- extSoftVersion()
z$BLAS <- as.character(es["BLAS"]) #drop name
z$LAPACK <- La_library()
class(z) <- "sessionInfo"
z
}
print.sessionInfo <- function(x, locale = TRUE,
RNG = !identical(x$RNGkind, .RNGdefaults),
...)
{
mkLabel <- function(L, n) {
vers <- sapply(L[[n]], function(x) x[["Version"]])
pkg <- sapply(L[[n]], function(x) x[["Package"]])
paste(pkg, vers, sep = "_")
}
cat(x$R.version$version.string, "\n", sep = "")
cat("Platform: ", x$platform, "\n", sep = "")
if (!is.null(x$running)) cat("Running under: ", x$running, "\n", sep = "")
cat("\n")
cat("Matrix products: ", x$matprod, "\n", sep = "")
blas <- x$BLAS
if (is.null(blas)) blas <- ""
lapack <- x$LAPACK
if (is.null(lapack)) lapack <- ""
if (blas == lapack && nzchar(blas))
cat("BLAS/LAPACK: ", blas, "\n", sep = "")
else {
if(nzchar(blas)) cat("BLAS: ", blas, "\n", sep = "")
if(nzchar(lapack)) cat("LAPACK: ", lapack, "\n", sep = "")
}
cat("\n")
if(RNG) {
cat("Random number generation:\n"
, "RNG: ", x$RNGkind[1], "\n"
, "Normal: ", x$RNGkind[2], "\n"
, "Sample: ", x$RNGkind[3], "\n"
, "\n")
}
if(locale) {
cat("locale:\n")
print(strsplit(x$locale, ";", fixed=TRUE)[[1]], quote=FALSE, ...)
cat("\n")
}
cat("attached base packages:\n")
print(x$basePkgs, quote=FALSE, ...)
if(!is.null(x$otherPkgs)){
cat("\nother attached packages:\n")
print(mkLabel(x, "otherPkgs"), quote = FALSE, ...)
}
if(!is.null(x$loadedOnly)){
cat("\nloaded via a namespace (and not attached):\n")
print(mkLabel(x, "loadedOnly"), quote = FALSE, ...)
}
invisible(x)
}
##' From a list of packageDescription()s,
##' construct string "<p1>~<ver>, <p2>~<ver>, ..., <pn>~<ver>"
toLatexPDlist <- function(pdList, sep = "~") {
if(length(ver <- vapply(pdList, `[[`, "", "Version"))) {
ver <- ver[sort(names(ver))]
paste(names(ver), ver, sep = sep, collapse = ", ")
} else ver
}
toLatex.sessionInfo <-
function(object, locale = TRUE,
RNG = !identical(object$RNGkind, .RNGdefaults),
...)
{
z <- c("\\begin{itemize}\\raggedright",
paste0(" \\item ", object$R.version$version.string,
", \\verb|", object$R.version$platform, "|"),
if(locale)
paste0(" \\item Locale: \\verb|",
gsub(";","|, \\\\verb|", object$locale) , "|"),
paste0(" \\item Running under: \\verb|",
gsub(";","|, \\\\verb|", object$running) , "|"),
if(RNG)
paste0(" \\item Random number generation:"
, " \\item RNG: \\verb|", object$RNGkind[1], "|"
, " \\item Normal: \\verb|", object$RNGkind[2], "|"
, " \\item Sample: \\verb|", object$RNGkind[3], "|"
)
, paste0(" \\item Matrix products: ", object$matprod)
)
blas <- object$BLAS
if (is.null(blas)) blas <- ""
lapack <- object$LAPACK
if (is.null(lapack)) lapack <- ""
if (blas == lapack && nzchar(blas))
z <- c(z, paste0(" \\item BLAS/LAPACK: \\verb|", blas, "|"))
else {
if (nzchar(blas))
z <- c(z, paste0(" \\item BLAS: \\verb|", blas, "|"))
if (nzchar(lapack))
z <- c(z, paste0(" \\item LAPACK: \\verb|", lapack, "|"))
}
z <- c(z, strwrap(paste("\\item Base packages: ",
paste(sort(object$basePkgs), collapse = ", ")),
indent = 2, exdent = 4))
if(length(o.ver <- toLatexPDlist(object$otherPkg)))
z <- c(z,
strwrap(paste(" \\item Other packages: ", o.ver),
indent = 2, exdent = 4))
if(length(n.ver <- toLatexPDlist(object$loadedOnly)))
z <- c(z,
strwrap(paste(" \\item Loaded via a namespace (and not attached): ",
n.ver),
indent = 2, exdent = 4))
z <- c(z, "\\end{itemize}")
class(z) <- "Latex"
z
}