4

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

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

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

更新 2:我忽略了与ctv的链接。如果您喜欢任务视图,包文档会很有趣。

4

2 回答 2

6

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

在您的情况下,您可能希望计算available.packages()获得的内容与您从ctv包中获得的任务视图选择之间的差异。

编辑 1您的“更新 1”想法很粗糙。太粗暴了。我认为,CRAN 的元信息来自正确地考虑元信息:第一组是所有包,每个任务视图的添加集,可能在“列出”和“推荐”之间拆分并聚合起来。

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

于 2011-09-01T01:06:37.987 回答
6

我应该ctv更仔细地阅读文档。答案就在那里:有一个名为 .rds 的文件Views.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. Views.rds从 CRAN 镜像中获取文件。
  2. 它将 Views.rds 加载到数据框中。注意:在 2.13 之前,需要使用一个.readRDS,现在readRDS是 2.13。 .readRDS仍然有效,尽管它已被弃用。
  3. 它获取可用软件包的列表。这可以更直接:有一个Packages.gz可以下载的文件,但是我们必须解析它。让我们坚持使用已经可用的工具。:)
  4. 它在两个列表上运行差异。为了好玩,请尝试相反的差异:oddPackages <- setdiff(aggInViews, availPkgs). 其中一些是基础 R 中的包。其他的是 ??? 谁知道。
于 2011-09-01T02:24:38.203 回答