|
|
- ## Do *NOT* use 1L -- it gives parse errors in historical versions of R
-
- ## Try a setup working in as old R as possible.
- ## ===>
- ## 1) do not use "_" in names! --- seems impossible for the Millenials ..
- ## 2) use our own simplified definition of '::' and ':::' ?
- ##
- if(!exists("local"))
- local <- function(expr, envir = environment()) { invisible(eval(expr, envir=envir)) }
-
- ##' Robust version of
- ##' utils:::.addFunctionInfo(c = c("recursive", "use.names"))
- local({
- U <- asNamespace("utils"); fn <- ".addFunctionInfo"
- EX <- exists(fn, envir=U)
- if(EX && is.function(FN <- get(fn, envir=U))) {
- FN(c = c("recursive", "use.names")); ##dbg: cat("Calling utils:::",fn,"(c = ...)\n")
- }
- })
-
- .ess_eval <- function(str, env = globalenv()) {
- ## don't remove; really need eval(parse( here!!
- tryCatch(base::eval(base::parse(text=str), envir = env),
- error=function(e) NULL) ## also works for special objects containing @:$ etc
- }
-
- .ess_nonull <- function(x, default = "") {
- if (is.null(x)) default
- else x
- }
-
- .ess_srcref <- function(name, pkg) {
- if (!is.null(pkg) && requireNamespace(pkg)) {
- env <- asNamespace(pkg)
- } else {
- env <- globalenv()
- }
- fn <- .ess_eval(name, env)
- out <- "()\n"
- if (is.function(fn) && !is.null(utils::getSrcref(fn))) {
- file <- utils::getSrcFilename(fn, full.names = TRUE)
- if (file != "") {
- line <- .ess_nonull(utils::getSrcLocation(fn, "line"), 1)
- col <- .ess_nonull(utils::getSrcLocation(fn, "column"), 1)
- out <- sprintf("(\"%s\" %d %d)\n", file, line, col - 1)
- }
- }
- cat(out)
- }
-
- .ess_fn_pkg <- function(fn_name) {
- fn <- .ess_eval(fn_name)
- env_name <- base::environmentName(base::environment(fn))
- out <- if (base::is.primitive(fn)) { # environment() does not work on primitives.
- "base"
- } else if (base::is.function(fn) && env_name != "R_GlobalEnv") {
- env_name
- } else {
- ""
- }
- base::cat(base::sprintf("%s\n", out))
- }
-
- .ess_funargs <- function(funname) {
- if(.ess.Rversion > '2.14.1') {
- ## temporarily disable JIT compilation and errors
- comp <- compiler::enableJIT(0)
- op <- options(error=NULL)
- on.exit({ options(op); compiler::enableJIT(comp) })
- }
- fun <- .ess_eval(funname)
- if(is.function(fun)) {
- special <- grepl('[:$@[]', funname)
- args <- if(!special){
- fundef <- paste(funname, '.default',sep='')
- do.call('argsAnywhere', list(fundef))
- }
-
- if(is.null(args))
- args <- args(fun)
- if(is.null(args))
- args <- do.call('argsAnywhere', list(funname))
-
- fmls <- formals(args)
- fmls_names <- names(fmls)
- fmls <- gsub('\"', '\\\"',
- gsub("\\", "\\\\", as.character(fmls), fixed = TRUE),
- fixed=TRUE)
- args_alist <-
- sprintf("'(%s)",
- paste("(\"", fmls_names, "\" . \"", fmls, "\")",
- sep = '', collapse = ' '))
- allargs <-
- if (special) fmls_names
- else tryCatch(gsub(' ?= ?', '', utils:::functionArgs(funname, ''), fixed = FALSE),
- error=function(e) NULL)
- allargs <- sprintf("'(\"%s\")",
- paste(allargs, collapse = '\" "'))
- envname <-
- if (is.primitive(fun)) "base"
- else environmentName(environment(fun))
- if (envname == "R_GlobalEnv") envname <- ""
- cat(sprintf('(list \"%s\" %s %s)\n',
- envname, args_alist, allargs))
- }
- }
-
- .ess_get_completions <- function(string, end, suffix = " = ") {
- oldopts <- utils::rc.options(funarg.suffix = suffix)
- on.exit(utils::rc.options(oldopts))
- if(.ess.Rversion > '2.14.1'){
- comp <- compiler::enableJIT(0)
- op <- options(error=NULL)
- on.exit({ options(op); compiler::enableJIT(comp)}, add = TRUE)
- }
- utils:::.assignLinebuffer(string)
- utils:::.assignEnd(end)
- utils:::.guessTokenFromLine()
- utils:::.completeToken()
- c(get('token', envir=utils:::.CompletionEnv),
- utils:::.retrieveCompletions())
- }
-
- .ess_arg_help <- function(arg, func){
- op <- options(error=NULL)
- on.exit(options(op))
- fguess <-
- if(is.null(func)) get('fguess', envir=utils:::.CompletionEnv)
- else func
- findArgHelp <- function(fun, arg){
- file <- help(fun, try.all.packages=FALSE)[[1]]
- hlp <- utils:::.getHelpFile(file)
- id <- grep('arguments', tools:::RdTags(hlp), fixed=TRUE)
- if(length(id)){
- arg_section <- hlp[[id[[1]]]]
- items <- grep('item', tools:::RdTags(arg_section), fixed=TRUE)
- ## cat('items:', items, fill=TRUE)
- if(length(items)){
- arg_section <- arg_section[items]
- args <- unlist(lapply(arg_section,
- function(el) paste(unlist(el[[1]][[1]], TRUE, FALSE), collapse='')))
- fits <- grep(arg, args, fixed=TRUE)
- ## cat('args', args, 'fits', fill=TRUE)
- if(length(fits))
- paste(unlist(arg_section[[fits[1]]][[2]], TRUE, FALSE), collapse='')
- }
- }
- }
- funcs <- c(fguess, tryCatch(methods(fguess),
- warning=function(w) {NULL},
- error=function(e) {NULL}))
- if(length(funcs) > 1 && length(pos <- grep('default', funcs))){
- funcs <- c(funcs[[pos[[1]]]], funcs[-pos[[1]]])
- }
- i <- 1; found <- FALSE
- out <- 'No help found'
- while(i <= length(funcs) && is.null(out <-
- tryCatch(findArgHelp(funcs[[i]], arg),
- warning=function(w) {NULL},
- error=function(e) {NULL})
- ))
- i <- i + 1
- cat('\n\n', as.character(out), '\n')
- }
|