Afficher les noms de tout dans un paquet

Existe-t-il un moyen facile de tout lister dans un paquet depuis R?

Par exemple, si je tape foreach::: et que j'appuie deux fois sur tab , je vois tout ce qui s'y trouve.

Comment puis-je obtenir ces noms d'objets autrement?

Note, ls("package:foreach", all.names=TRUE) ne montre pas des choses comme .foreachGlobals

13
demandé sur bartektartanus 2012-08-24 21:52:46

4 réponses

ls("package:foreach", all.names=TRUE) montre seulement ce qui est attaché au chemin de recherche, qui n'inclut que les objets exportés de l'espace de noms. Utilisez ls sur les résultats de getNamespace à la place:

ls(getNamespace("foreach"), all.names=TRUE)
24
répondu Joshua Ulrich 2012-08-24 19:26:41

Un utilitaire que j'ai été en utilisant que je trouve utile pour cela (et donne aussi quelques autres choses):

ls(get('.__NAMESPACE__.', envir = asNamespace('ggplot2', base.OK = FALSE),
       inherits = FALSE))
[1] "dynlibs"   "exports"   "imports"   "lazydata"  "path"      "S3methods" "spec"     

pour accéder à toutes les variables exportées et internes dans L'espace de noms, c'est-à-dire

ggplot2:::

lsp(ggplot2)

# [1] ".__C__Scales"                     ".__global__"                     
# [3] ".__NAMESPACE__."                  ".__S3MethodsTable__."            
# [5] ".all_aesthetics"                  ".base_to_ggplot"                 
# [7] ".element_tree"                    ".onAttach"                       
# [9] ".packageName"                     ".plot_store" 
# ...

pour accéder seulement exporté, c'est-à-dire,

ggplot2::

lsp(ggplot2, 'exports')

# $exports
# [1] "%+%"                       "%+replace%"               
# [3] "aes"                       "aes_all"                  
# [5] "aes_auto"                  "aes_q"                    
# [7] "aes_string"                "annotate"                 
# [9] "annotation_custom"         "annotation_logticks"    
# ...

pour le chemin de la bibliothèque

lsp('ggplot2', 'path')

# $path
# [1] "/Library/Frameworks/R.framework/Versions/3.1/Resources/library/ggplot2"

pour les données incluses dans les colis

lsp('ggplot2', 'lazydata')

# $lazydata
# [1] "diamonds"     "economics"    "midwest"      "movies"       "mpg"         
# [6] "msleep"       "presidential" "seals"  

pour les méthodes S3

lsp('ggplot2', 'S3methods')

# $S3methods
# [,1]                         [,2]                       [,3]                              
# [1,] "+"                     "gg"                       "+.gg"                            
# [2,] "["                     "uneval"                   "[.uneval"                        
# [3,] "as.character"          "uneval"                   "as.character.uneval"             
# [4,] "autoplot"              "default"                  "autoplot.default"                
# [5,] "coord_aspect"          "default"                  "coord_aspect.default"            
# [6,] "coord_aspect"          "fixed"                    "coord_aspect.fixed"              
# [7,] "coord_aspect"          "map"                      "coord_aspect.map"                
# [8,] "coord_aspect"          "polar"                    "coord_aspect.polar"              
# [9,] "coord_aspect"          "quickmap"                 "coord_aspect.quickmap" 
# ...

tout voir

lsp('ggplot2')

# pages and pages

code:

lsp <- function(package, what, pattern) {
  if (!is.character(substitute(package)))
    package <- deparse(substitute(package))
  ns <- asNamespace(package)
  if (missing(pattern))
    pattern <- '.*'

  ## base package does not have NAMESPACE
  if (isBaseNamespace(ns)) {
    res <- ls(.BaseNamespaceEnv, all.names = TRUE)
    return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)])
  } else {
    ## for non base packages
    if (exists('.__NAMESPACE__.', envir = ns, inherits = FALSE)) {
      wh <- get('.__NAMESPACE__.', inherits = FALSE,
                envir = asNamespace(package, base.OK = FALSE))
      what <- if (missing(what)) 'all'
      else if ('?' %in% what) return(ls(wh)) 
      else ls(wh)[pmatch(what[1], ls(wh))]
      if (!is.null(what) && !any(what %in% c('all', ls(wh))))
        stop('\'what\' should be one of ',
             paste0(shQuote(ls(wh)), collapse = ', '),
             ', or \'all\'', domain = NA)
      res <- sapply(ls(wh), function(x) getNamespaceInfo(ns, x))
      res <- rapply(res, ls, classes = 'environment',
                    how = 'replace', all.names = TRUE)
      if (is.null(what))
        return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)])
      if (what %in% 'all') {
        res <- ls(getNamespace(package), all.names = TRUE)
        return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)])
      }
      if (any(what %in% ls(wh))) {
        res <- res[[what]]
        return(res[grep(pattern, res, perl = TRUE, ignore.case = TRUE)])
      }
    } else stop(sprintf('no NAMESPACE file found for package %s', package))
  }
}

j'aime aussi parce qu'il montre comment utile rapply peut être :}

4
répondu rawr 2018-03-22 16:51:57

Revolution R Enterprise (free for Academic use) est un éditeur/débogueur/GUI pour R qui a une fenêtre 'Object Browser' ouverte au démarrage par défaut. Cliquer sur un paquet vous permet de voir tous ses contenus, y compris les classes et les environnements. Je trouve cela très utile.

1
répondu dardisco 2012-08-27 03:24:20

je sais que c'est une question plus ancienne, mais j'ai récemment créé un script qui fonctionne bien pour obtenir cette information. Il prendra un vecteur de noms de paquets pour obtenir les informations suivantes pour chaque fonction dans chaque paquet. Le nom du paquet, le nom de la fonction str() pour la fonction, et le texte de description du fichier d'aide pour chaque fonction. Le Code est ci-dessous au cas où quelqu'un serait intéressé.

available.packages <- installed.packages()
suppressMessages(if(!"XML" %in% available.packages) install.packages("XML",repos = "https://cran.cnr.berkeley.edu/"))
library(XML)

# Function to get data from help console
help_console <- function(topic, format=c("text", "html", "latex", "Rd"),
                         lines=NULL, before=NULL, after=NULL, pkg) {  
  format=match.arg(format)
  if (!is.character(topic)) topic <- deparse(substitute(topic))

  helpfile <- tryCatch({
    helpfile <- utils:::.getHelpFile(help(topic, package = as.character(pkg)))
  }, error = function(err) {
    helpfile <- NA
  }) 

  if(!is.na(helpfile[1]))
    {hs <- capture.output(switch(format, 
                                 text=tools:::Rd2txt(helpfile),
                                 html=tools:::Rd2HTML(helpfile),
                                 latex=tools:::Rd2latex(helpfile),
                                 Rd=tools:::prepare_Rd(helpfile)))

     if(!is.null(lines)) hs <- hs[lines]
     hs <- c(before, hs, after)
     html <- paste(hs, sep="\n", collapse = "")
  } else{
    html <- NA
  }

  return(html)
}

# Function to retrieve information on functions within a package
get.funcs <- function(pkg){
  if(pkg %in% available.packages){
    print(pkg)
    require(pkg, character.only = TRUE)

    df <- as.data.frame(as.vector(lsf.str(paste0("package:", pkg))), stringsAsFactors = FALSE)
    colnames(df) <- "function.name"

    df$usage <- sapply(df$function.name, function(x) capture.output(str(get(x)))[1])
    df$package <- pkg

    df$description <- mapply(function(x,y) {
                             html <- help_console(x, "html", lines = 1:25, before = "", after = "", pkg = y)
                             if(!is.na(html)){
                               doc <- htmlParse(html, asText = TRUE)
                               plain.text <- xpathSApply(doc, "//p", xmlValue)[1]
                             } else{
                               plain.text <- NA
                             }
                             },
                             df$function.name,
                             df$package)

    return(df[,c("package","function.name","usage","description")])
  } else{
    print(paste(pkg, "- has not been installed and cannot be processed!"))
    return(NULL)
  }
}


# Create a vector of packages to process
packages <- c("base","dplyr","lubridate","plyr","readr","readxl","reshape2","RODBC","stringr","tidyr","XLConnect","xlsx","XML","zoo")

# Create a list of dataframes containing package information
ldf <- lapply(packages, get.funcs)

# Combine all dataframes in the list to a single dataframe
df <- do.call(rbind, ldf)
0
répondu Matt Jewett 2017-06-26 17:19:03