blob: 8b5ef0e87ab5623f8779670c596256a8d2f0d8fa [file] [log] [blame]
#=============================================================================#
# Copyright (c) 2009, 2018 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================#
## RJ init
.rj.config <- new.env()
.rj.config$isDebug <- FALSE
#' Initializes the package
.onLoad <- function(libname, pkgname) {
utilsEnv <- getNamespace("utils")
assign("help", envir = .rj.originals, value = get("help", envir = utilsEnv))
assign("help.start", envir = .rj.originals, value = get("help.start", envir = utilsEnv))
return (invisible(TRUE))
}
.rj.originals <- new.env()
## Tmp
#' Environment for temporary R objects
.rj.tmp <- new.env()
#' Returns the next available id (a element name with the specified prefix)
#'
#' @param prefix prefix of the element name, usually a key for a element type
#' @param envir optional environment, default is \code{.rj.tmp}
#' @return the id
#' @returnType char
tmp.createId <- function(prefix, envir = .rj.tmp) {
i <- 1L;
repeat {
name <- paste(prefix, i, sep= "")
if (!exists(name, envir = envir, inherits = FALSE)) {
assign(name, NULL, envir= envir)
return(name);
}
i <- i + 1L;
}
}
tmp.set <- function(name, value, envir = .rj.tmp) {
assign(name, value, envir= envir)
return (invisible())
}
tmp.remove <- function(name, envir = .rj.tmp) {
if (exists(name, envir= envir, inherits= FALSE)) {
rm(list= name, envir= envir, inherits= FALSE)
}
return (invisible())
}
tmp.removeAll <- function(id, envir = .rj.tmp) {
names <- ls(envir= envir, pattern= paste0("^\\Q", id, "\\E"))
if (length(names)) {
rm(list= names, envir= envir, inherits= FALSE)
}
return (invisible())
}
tmp.setReverseIndex <- function(name, index, len = NA, envir = .rj.tmp) {
index = get(index, envir= envir, inherits= FALSE)
if (is.na(len)) {
len <- length(index)
}
index.r <- rep.int(NA_integer_, len)
index.r[index] <- 1L:length(index)
assign(name, index.r, envir= envir)
return (invisible())
}
tmp.setWhichIndex <- function(name, filter, envir = .rj.tmp) {
filter <- get(filter, envir= envir, inherits= FALSE)
filter <- which(filter)
assign(name, filter, envir= envir)
return (invisible())
}
tmp.setFilteredIndex <- function(name, filter, index, envir = .rj.tmp) {
filter <- get(filter, envir= envir, inherits= FALSE)
index <- get(index, envir= envir, inherits= FALSE)
if (length(dim(index)) > 1L) {
idx <- index[,1L]
index <- index[filter[idx],]
}
else {
index <- index[filter[index]]
}
assign(name, index, envir= envir)
return (invisible())
}
tmp.getFilteredCount <- function(index, filter, envir = .rj.tmp) {
filter <- get(filter, envir= envir, inherits= FALSE)
if (missing(index)) {
return (sum(filter))
}
index <- get(index, envir= envir, inherits= FALSE)
if (length(dim(index)) > 1L) {
index <- index[,1L]
}
return (sum(filter[index]))
}
tmp.clear <- function(envir = .rj.tmp) {
toRemove <- ls(envir= envir)
toRemove <- toRemove[toRemove != "help"] # TODO Remove in RJ-1.2
rm(list= toRemove, envir= envir)
}
## Internal utils
.rj.errorHandler <- function(e) {
if (.rj.config$isDebug) {
print(e)
}
}
patchPackage <- function(name, value, envir, ns = TRUE) {
if (exists(name, envir)) {
unlockBinding(name, envir)
on.exit(lockBinding(name, envir), add= TRUE)
assign(name, value, envir)
}
if (ns && getRversion() < "2.15.0") {
envName <- environmentName(envir)
if (envName == "base") {
ns <- "base"
}
else if (!is.null(envName) && substring(envName, 1L, 8L) == "package:") {
ns <- asNamespace(substring(envName, 9L))
}
else {
ns <- NULL
}
if (!is.null(ns)) {
assignInNamespace(name, value, ns= ns)
}
}
return (invisible(TRUE))
}
resolveVisible <- function(result) {
if (result$visible) {
return (result$value)
}
else {
return (invisible(result$value))
}
}