blob: ac80db7e4fd57eec6fec5ee8f8cd8244c2543e57 [file] [log] [blame]
# File src/library/base/R/New-Internal.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2018 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/
geterrmessage <- function() .Internal(geterrmessage())
try <- function(expr, silent = FALSE,
outFile = getOption("try.outFile", default = stderr())) {
tryCatch(expr, error = function(e) {
call <- conditionCall(e)
if (! is.null(call)) {
## Patch up the call to produce nicer result for testing as
## try(stop(...)). This will need adjusting if the
## implementation of tryCatch changes.
## Use identical() since call[[1L]] can be non-atomic.
if (identical(call[[1L]], quote(doTryCatch)))
call <- sys.call(-4L)
dcall <- deparse(call)[1L]
prefix <- paste("Error in", dcall, ": ")
LONG <- 75L # to match value in errors.c
sm <- strsplit(conditionMessage(e), "\n")[[1L]]
w <- 14L + nchar(dcall, type="w") + nchar(sm[1L], type="w")
## this could be NA if any of this is invalid in a MBCS
if(is.na(w))
w <- 14L + nchar(dcall, type="b") + nchar(sm[1L], type="b")
if (w > LONG)
prefix <- paste0(prefix, "\n ")
}
else prefix <- "Error : "
msg <- paste0(prefix, conditionMessage(e), "\n")
## Store the error message for legacy uses of try() with
## geterrmessage().
.Internal(seterrmessage(msg[1L]))
if (! silent && isTRUE(getOption("show.error.messages"))) {
cat(msg, file = outFile)
.Internal(printDeferredWarnings())
}
invisible(structure(msg, class = "try-error", condition = e))
})
}
comment <- function(x) .Internal(comment(x))
`comment<-` <- function(x, value) .Internal("comment<-"(x, value))
logb <- function(x, base=exp(1)) if(missing(base)) log(x) else log(x, base)
atan2 <- function(y, x) .Internal(atan2(y, x))
beta <- function(a, b) .Internal( beta(a, b))
lbeta <- function(a, b) .Internal(lbeta(a, b))
psigamma <- function(x, deriv = 0L) .Internal(psigamma(x, deriv))
factorial <- function(x) gamma(x + 1)
lfactorial <- function(x) lgamma(x + 1)
choose <- function(n, k) .Internal(choose(n, k))
lchoose <- function(n, k) .Internal(lchoose(n, k))
##-- 2nd part --
R.Version <- function() .Internal(Version())
commandArgs <- function(trailingOnly = FALSE) {
args <- .Internal(commandArgs())
if(trailingOnly) {
m <- match("--args", args, 0L)
if(m) args[-seq_len(m)] else character()
} else args
}
args <- function(name) .Internal(args(name))
cbind <- function(..., deparse.level = 1)
.Internal(cbind(deparse.level, ...))
rbind <- function(..., deparse.level = 1)
.Internal(rbind(deparse.level, ...))
## methods:::bind_activation defunct as of 2018-02-05 (R >= 3.5.0)
## Deprecating these aliases now
.__H__.cbind <- function(..., deparse.level = 1) {
.Deprecated("base::cbind")
.Internal(cbind(deparse.level, ...))
}
.__H__.rbind <- function(..., deparse.level = 1) {
.Deprecated("base::rbind")
.Internal(rbind(deparse.level, ...))
}
# convert deparsing options to bitmapped integer
..deparseOpts <-
## the exact order of these is determined by the integer codes in
## ../../../include/Defn.h
c("all",
"keepInteger", "quoteExpressions", "showAttributes", # 2,3,4
"useSource", "warnIncomplete", "delayPromises", # 5,6,7
"keepNA", "S_compatible", "hexNumeric", # 8,9,10
"digits17", "niceNames") # 11,12
.deparseOpts <- function(control) {
if(!length(control)) return(0) # fast exit
opts <- pmatch(as.character(control), ..deparseOpts)
if (anyNA(opts))
stop(sprintf(ngettext(as.integer(sum(is.na(opts))),
"deparse option %s is not recognized",
"deparse options %s are not recognized"),
paste(sQuote(control[is.na(opts)]), collapse=", ")),
call. = FALSE, domain = NA)
if (any(opts == 1L)) # "all"
opts <- unique(c(opts[opts != 1L], 2L,3L,4L,5L,6L,8L, 12L)) # not (7,9:11)
if(10L %in% opts && 11L %in% opts)
stop('"hexNumeric" and "digits17" are mutually exclusive')
sum(2^(opts-2))
}
deparse <-
function(expr, width.cutoff = 60L,
backtick = mode(expr) %in% c("call", "expression", "(", "function"),
control = c("keepNA", "keepInteger", "niceNames", "showAttributes"),
nlines = -1L)
.Internal(deparse(expr, width.cutoff, backtick,
.deparseOpts(control), nlines))
do.call <- function(what, args, quote = FALSE, envir = parent.frame())
{
if (!is.list(args))
stop("second argument must be a list")
if (quote)
args <- lapply(args, enquote)
.Internal(do.call(what, args, envir))
}
drop <- function(x) .Internal(drop(x))
format.info <- function(x, digits = NULL, nsmall = 0L)
.Internal(format.info(x, digits, nsmall))
gc <- function(verbose = getOption("verbose"), reset=FALSE, full=TRUE)
{
res <- .Internal(gc(verbose, reset, full))
res <- matrix(res, 2L, 7L,
dimnames = list(c("Ncells","Vcells"),
c("used", "(Mb)", "gc trigger", "(Mb)",
"limit (Mb)", "max used", "(Mb)")))
if(all(is.na(res[, 5L]))) res[, -5L] else res
}
gcinfo <- function(verbose) .Internal(gcinfo(verbose))
gctorture <- function(on = TRUE) .Internal(gctorture(on))
gctorture2 <- function(step, wait = step, inhibit_release = FALSE)
.Internal(gctorture2(step, wait, inhibit_release))
is.unsorted <- function(x, na.rm = FALSE, strictly = FALSE)
{
if(length(x) <= 1L) return(FALSE)
if(!na.rm && anyNA(x))
return(NA)
## else
if(na.rm && any(ii <- is.na(x)))
x <- x[!ii]
.Internal(is.unsorted(x, strictly))
}
nchar <- function(x, type = "chars", allowNA = FALSE, keepNA = NA)
.Internal(nchar(x, type, allowNA, keepNA))
polyroot <- function(z) .Internal(polyroot(z))
readline <- function(prompt = "") .Internal(readline(prompt))
search <- function() .Internal(search())
searchpaths <- function()
{
s <- search()
paths <-
lapply(seq_along(s), function(i) attr(as.environment(i), "path"))
paths[[length(s)]] <- system.file()
m <- grep("^package:", s)
if(length(m)) paths[-m] <- as.list(s[-m])
unlist(paths)
}
sprintf <- function(fmt, ...) .Internal(sprintf(fmt, ...))
##-- DANGER ! --- substitute(list(...)) inside functions !!!
##substitute <- function(expr, env=baseenv()) .Internal(substitute(expr, env))
t.default <- function(x) .Internal(t.default(x))
typeof <- function(x) .Internal(typeof(x))
memory.profile <- function() .Internal(memory.profile())
capabilities <- function(what = NULL)
{
z <- .Internal(capabilities())
if(!is.null(what))
z <- z[match(what, names(z), 0L)]
if(.Platform$OS.type == "windows") return(z)
## Now we need to deal with any NA entries if X11 is unknown.
nas <- names(z[is.na(z)])
if(any(nas %in% c("X11", "jpeg", "png", "tiff"))) {
## This might throw an X11 error
z[nas] <- tryCatch(.Internal(capabilitiesX11()),
error = function(e) FALSE)
}
z
}
inherits <- function(x, what, which = FALSE)
.Internal(inherits(x, what, which))
NextMethod <- function(generic=NULL, object=NULL, ...)
.Internal(NextMethod(generic, object,...))
data.class <- function(x) {
if (length(cl <- oldClass(x)))
cl[1L]
else {
l <- length(dim(x))
if (l == 2L) "matrix" else if(l) "array" else mode(x)
}
}
encodeString <- function(x, width = 0L, quote = "", na.encode = TRUE,
justify = c("left", "right", "centre", "none"))
{
at <- attributes(x)
x <- as.character(x) # we want e.g. NULL to work
attributes(x) <- at # preserve names, dim etc
oldClass(x) <- NULL # but not class
justify <- match(match.arg(justify),
c("left", "right", "centre", "none")) - 1L
.Internal(encodeString(x, width, quote, justify, na.encode))
}
l10n_info <- function() .Internal(l10n_info())
iconv <- function(x, from = "", to = "", sub = NA, mark = TRUE, toRaw = FALSE)
{
if(! (is.character(x) || (is.list(x) && is.null(oldClass(x)))))
x <- as.character(x)
.Internal(iconv(x, from, to, as.character(sub), mark, toRaw))
}
iconvlist <- function()
{
int <- .Internal(iconv(NULL, "", "", "", TRUE, FALSE))
if(length(int)) return(sort.int(int))
icfile <- system.file("iconvlist", package="utils")
if(!nchar(icfile, type="bytes"))
stop("'iconvlist' is not available on this system")
ext <- readLines(icfile)
if(!length(ext)) stop("'iconvlist' is not available on this system")
## glibc has lines ending //, some versions with a header and some without.
## libiconv has lines with multiple entries separated by spaces
cnt <- grep("//$", ext)
if(length(cnt)/length(ext) > 0.5) {
ext <- grep("//$", ext, value = TRUE)
ext <- sub("//$", "", ext)
}
sort.int(unlist(strsplit(ext, "[[:space:]]")))
}
Cstack_info <- function() .Internal(Cstack_info())
reg.finalizer <- function(e, f, onexit = FALSE)
.Internal(reg.finalizer(e, f, onexit))
Encoding <- function(x) .Internal(Encoding(x))
`Encoding<-` <- function(x, value) .Internal(setEncoding(x, value))
setTimeLimit <- function(cpu = Inf, elapsed = Inf, transient = FALSE)
.Internal(setTimeLimit(cpu, elapsed, transient))
setSessionTimeLimit <- function(cpu = Inf, elapsed = Inf)
.Internal(setSessionTimeLimit(cpu, elapsed))
icuSetCollate <- function(...) .Internal(icuSetCollate(...))
icuGetCollate <- function(type = c("actual", "valid")) {
type <- match.arg(type)
.Internal(icuGetCollate(match(type, c("actual", "valid"))))
}
extSoftVersion <- function() .Internal(eSoftVersion())
libcurlVersion <- function() .Internal(curlVersion())
curlGetHeaders <- function(url, redirect = TRUE, verify = TRUE)
.Internal(curlGetHeaders(url, redirect, verify))
lengths <- function(x, use.names=TRUE) .Internal(lengths(x, use.names))
mem.maxVSize <- function(vsize = 0) .Internal(mem.maxVSize(vsize))
mem.maxNSize <- function(nsize = 0) .Internal(mem.maxNSize(nsize))
## base has no S4 generics
.noGenerics <- TRUE