如何列出未包含在任何R任务视图中的软件包?

时间:2011-09-01 00:59:26

标签: r cran

我最近一直在查看R Task Views,并发现一些感兴趣的软件包不包含在任何任务视图中。是否有既定的方法来查找任务视图中列出的软件包的补充?

我意识到通过XML和处理ctv文件(例如http://cran.r-project.org/web/views/Econometrics.ctv),我可以找到<packagelist>节点中列出的所有包的并集,available.packages()可列出所有可供下载的软件包。这是诀窍,还是我错过了使用CRANberriesCRANtastic这样的网站的一些技巧?

更新1(不要这样做 - 请参阅下面的答案):我忽略了提到CRAN列出了“在视图中:”的包。因此,似乎在幕后,一些信息会将包与其所在的视图进行匹配。可以轻松(并且粗鲁地)刮掉所有CRAN包页面并grep“In views:”。这是我最初的想法,直到我遇到ctv,这更加优雅。

更新2:我忽略了与ctv的关联。如果你进入任务视图,包文档会很有趣。

2 个答案:

答案 0 :(得分:6)

没有隐藏的技巧,只需重新创建类似CRANberries的东西(通过调用available.packages()并与存储在本地数据库中的状态数据进行比较)。

在您的情况下,您可能希望计算available.packages()获取的内容与ctv包中有关任务视图选项的内容之间的集合差异。

编辑1 您的“更新1”理念很粗糙。太粗糙了。 CRAN的元信息来自于,正确地考虑了元信息:首先是所有包,每个任务视图的添加集,可能在“列出”和“推荐”之间进行分割并汇总。

编辑2 我认为您只需使用ctv中的代码来解析其文件。我们在cran2deb中使用它来定义用于包创建的较小测试集。给定该集合(和其他数据),他们可以生成网页。我想你可能会让事情变得过于复杂。 R使得这成为可能,因为我也非常了解; - )

答案 1 :(得分:6)

我应该更仔细地阅读ctv文档。答案就在那里:有一个名为Views.rds的.rds文件。这是一个循序渐进的方法:

myRepos         <- "http://cran.r-project.org"
tmpfile         <- tempfile()
download.file(paste(myRepos, "src/contrib/Views.rds", sep = "/"), destfile = tmpfile)

myViews         <- .readRDS(tmpfile)
func_listPkgs   <- function(x){return(x$packagelist$name)}
aggRaw          <- lapply(myViews, func_listPkgs)
aggInViews      <- unique(unlist(aggRaw))

availRaw        <- available.packages(contriburl = paste(myRepos, "src/contrib", sep = "/"))
availPkgs       <- rownames(availRaw)
notInViews      <- setdiff(availPkgs, aggInViews)

以下是这样做:

  1. 它从CRAN镜像中获取Views.rds文件。
  2. 将Views.rds加载到数据框中。注意:在2.13之前,需要使用.readRDS,现在readRDS和2.13。 .readRDS仍有效,但已被弃用。
  3. 它获取可用包的列表。这可以更直接:有一个名为Packages.gz的文件可以下载,但我们必须解析它。让我们坚持使用已有的工具。 :)
  4. 它在两个列表上运行差异。为了好玩,尝试相反的差异:oddPackages <- setdiff(aggInViews, availPkgs)。其中一些是基地R的包。其他是???谁知道呢。