我最近一直在仔细查看R任务视图,并发现一些感兴趣的软件包不包含在任何任务视图中.是否有既定的方法来查找任务视图中列出的软件包的补充?
我意识到通过XML和处理ctv文件(例如http://cran.r-project.org/web/views/Econometrics.ctv),我可以找到<packagelist>节点中列出的所有包的联合,那available.packages()可以列出所有可供下载的软件包.这是诀窍,还是我错过了使用像CRANberries或CRANtastic这样的网站的一些技巧?
更新1(不要这样做 - 请参阅下面的答案):我忽略了提到CRAN列出了"在视图中:"的包.因此,似乎在幕后,一些信息会将包与它们所在的视图进行匹配.可以轻松(并且粗鲁地)刮掉所有CRAN包页面并grep"In views:".这是我最初的想法,直到我遇到ctv,这更优雅.
更新2:我忽略了链接到ctv.如果你进入任务视图,那么包文档很有趣.
没有隐藏的技巧,只需重新创建类似CRANberries的东西(通过调用available.packages()和比较它存储在本地数据库中的状态数据开始).
在您的情况下,您可能希望计算available.packages()得到的内容与从ctv任务视图选项中获得的内容之间的集合差异.
编辑1您的"更新1"想法很粗糙.太粗糙了.CRAN中的元信息来自于,正确地考虑了元信息:首先是所有包,每个任务视图的添加集,可能在"列出"和"推荐"之间进行分割并汇总.
编辑2我认为你只是使用代码ctv来解析它的文件,来自集合.我们使用它cran2deb来定义用于包创建的较小测试集.给定该集合(和其他数据),他们可以生成网页.我想你可能会让事情变得过于复杂.R使这成为可能,因为我也知道太好了;-)
我应该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)
Run Code Online (Sandbox Code Playgroud)
这是这样做的:
Views.rds从CRAN镜像获取文件..readRDS,现在readRDS使用2.13. .readRDS仍然有用,虽然它已被弃用.Packages.gz可以下载的文件,但我们必须解析它.让我们坚持使用已有的工具.:)oddPackages <- setdiff(aggInViews, availPkgs).其中一些是基地R的包.其他是??? 谁知道.