Raw File
packageAdd.R
"packageAdd" <-
  function(pkg, files, path = ".", document = TRUE) {
    ## utility to find the package's env on the search list
    findPkg <- function(pkg) {
      ev = .GlobalEnv
      pkgName <- paste("package", pkg, sep=":")
      while(!is.null(ev)) {
        ev = parent.env(ev)
        if(identical(pkgName, attr(ev, "name")))
          break
      }
      ev
    }
    evPkg <- findPkg(pkg)
    if(is.null(evPkg)) {
      require(pkg, character.only = TRUE)
      evPkg <- findPkg(pkg)
      if(is.null(evPkg))
        stop("Package \"", pkg,
             "\" should be available when packageAdd() is called")
    }
    topenvPrev <- options("topLevelEnvironment")
    on.exit(options(topenvPrev))
    for(file in files) {
      ev = new.env(parent = evPkg)
      ## simulate the package name as inserted by library()
      ## Needed for classs, method definitions but much too low-level
      ## to be exposed to poor programmers.  Oh well!
      assign(".packageName", pkg, envir = ev)
      ## arrange for default topenv() to go to this ev
      options(topLevelEnvironment = ev)
      exprs <- parse(file)
      eval(exprs, envir = ev)
      sourceFile = basename(file)
      manDir = file.path(path, pkg, "man")
      what <- objects(ev, all.names=TRUE)
      if(document) {
        docCommon <- character() # objects documented together
        for(name in what) {
          obj <- get(name, envir = ev)
          if(is(obj, "MethodsList")) {
            fName <- metaNameUndo(name)
            packageSlot(fName) <- pkg
            fileName <- file.path(manDir, paste(.topicName("methods",fName),"Rd",sep="."))
            promptMethods(fName,  fileName, obj)
          }
          else if(is(obj, "classRepresentation")) {
            clName <- as.character(metaNameUndo(name, "C"))
            fileName <- file.path(manDir, paste(.topicName("class",clName),"Rd",sep="."))
            promptClass(clName, fileName, where = ev)
          }
          else
            docCommon <- c(docCommon, name)
        }
        if(length(docCommon)) {
          fileName <- file.path(manDir, paste(docCommon[[1]], "Rd", sep="."))
          promptAll(docCommon, fileName)
        }
      }
      sourceCopyFile <- file.path(path, pkg, "R", sourceFile)
      file.copy(file, sourceCopyFile)
      message("Copied file ", file, " to ", sourceCopyFile)
    }
  }

.topicName <- function(type, what)
  paste(what, type, sep="-")
back to top