【问题标题】:Names of R's available packagesR 可用包的名称
【发布时间】:2011-09-11 23:14:20
【问题描述】:

我很想知道,

  • CRAN 上有多少个包名有两个、三个、N 个字符?
  • 哪些组合尚未使用(“unpoppler”)
  • 有多少包名称使用全大写或驼峰式?
  • 有多少个包名以 2 结尾?

我认为它可能会揭示一些有趣的事实。

编辑: 显示 CRAN 包随时间演变的动画图形的奖励积分。

【问题讨论】:

  • 这是一个有趣的问题,但我不确定它是否真的如此风格。不过,应该只是将名称从 cran.r-project.org/web/packages/available_packages_by_name.html 中删除并在它们上运行一些正则表达式。
  • @Owen 这两点我都同意,但好奇心的缘故让我心服口服。
  • 抓取是多余的:看看myList[,"Package"] 哪里有myList <- available.packages()。此列表每天都会更改。
  • 关于时间演变,这里有一个带有API的数据库:github.com/metacran/crandb(免责声明:我是它的作者。)它有一些不正确的数据,特别是档案的日期经常是错误的。其中一些我可以并且会修复,但对于某些人来说,AFAIK 没有可用的信息。
  • 你正在使用 metacran 完成出色的工作

标签: r cran


【解决方案1】:

比抓取网页来获取包名称更好的方法是使用available.packages() 函数并处理这些结果。 available.packages() 返回一个矩阵,其中包含所有可用软件包的详细信息(但默认情况下会被过滤 - 请参阅 ?available.packages 的详细信息部分了解更多信息)。

pkgs <- available.packages(filters = "duplicates")
nameCount <- unname(nchar(pkgs[, "Package"]))
table(nameCount)

> table(nameCount)
nameCount
  2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21 
 32 311 374 360 434 445 368 277 199 132  99  56  56  43  22  19  18   2  12   8 
 22  24  25  31 
  5   2   1   1

使用nameCount,我们可以选择名称包含任意数量字符的包,而无需求助于正则表达式等:

> unname(pkgs[which(nameCount == 2), "Package"])
 [1] "BB" "bs" "ca" "cg" "dr" "ez" "FD" "ff" "HH" "HI" "iv" "JM" "ks" "M3" "mi"
[16] "np" "oc" "oz" "PK" "PP" "qp" "QT" "RC" "rv" "Rz" "sm" "sn" "sp" "st" "SV"
[31] "tm" "wq"

【讨论】:

    【解决方案2】:

    这是基于各种建议的一个镜头。

     packages <- available.packages()[,'Package']
    
     ggplot(data.frame(n = nchar(packages))) +
       geom_histogram(aes(n), binwidth=1)     
    

     all <- length(packages)
     ## 3168
     up <- sum(toupper(packages) == packages)
     ## 262
     low <- sum(tolower(packages) == packages)
     ## 1697
     pie(c(up, low, all-up-low), labels=c("UPPERCASE","lowercase","cAmElCaSe"))
    

     let <- sapply(sapply(letters, grep, tolower(packages)), length)
     barplot(let)
    

     length(packages[grep("2$", packages, perl=TRUE)])
     # 29
    

    【讨论】:

    • 也很有趣:有多少包包含点? packages[grepl("\\.", packages)]
    • 在您的饼图中,“cAmElCaSe”还包括仅首字母大写的那些,我不认为它是 CamelCase。
    【解决方案3】:

    这里有一小段代码可以回答一些问题。有时间我会继续补充我的答案。

    library(XML); library(ggplot2);
    
    url = 'http://cran.r-project.org/web/packages/available_packages_by_name.html'
    packages = readHTMLTable(url, stringsAsFactors = F)[[1]][-1,]
    
    # histogram of number of characters in package name
    qplot(nchar(V1), data = packages)
    

    【讨论】:

    • 很好,RthroughExcelWorkbooksInstaller2 有人吗? :)
    • +1,尽管这可能会稍微夸大两个字符的数字,因为当第一个字母发生变化时,它会拾取一些 NA 值(例如 packages[128,]),可能来自 html 部分名称。
    • 是的。但我认为available.packages 解决方案更加优雅和强大。
    【解决方案4】:

    使用所有包制作一个向量

    myList <- available.packages()[,'Package']
    

    然后您可以根据需要进行分析。例如,只有两个字符名称的包列表

    myList[grep('^..$', myList)]
    

    【讨论】:

    • nchar 用于计算字符串中的字符数更快、更易读。 myList[nchar(myList) == 2]
    • 另外,使用grepl 而不是grep 进行索引。如果你有一个空匹配,grep 不会做你认为它做的事情。
    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多