如何从CRAN中提取所有包作者的名称

And*_*rie 12 r cran

为了庆祝标签中的 100,000个问题,我想创建一个CRAN上所有包作者名称的列表.

最初,我认为我可以使用,available.packages()但遗憾的是,这不包含作者的专栏.

pdb <- available.packages()
colnames(pdb)

 [1] "Package"               "Version"               "Priority"             
 [4] "Depends"               "Imports"               "LinkingTo"            
 [7] "Suggests"              "Enhances"              "License"              
[10] "License_is_FOSS"       "License_restricts_use" "OS_type"              
[13] "Archs"                 "MD5sum"                "NeedsCompilation"     
[16] "File"                  "Repository"   
Run Code Online (Sandbox Code Playgroud)

DESCRIPTION每个包的文件中都提供了此信息.所以我可以想到两种蛮力方式,两者都不是很优雅:

  1. 下载每个6,878个软件包并DESCRIPTION使用读取文件base::read.dcf()

  2. 刮掉CRAN上的每个包页面.例如,https://cran.r-project.org/web/packages/MASS/index.html告诉我Brian Ripley是MASS的作者.

我不想下载所有CRAN来回答这个问题.而且我也不想刮HTML,因为DESCRIPTION文件中的信息是一个整齐格式的person对象列表(请参阅参考资料?person).

如何使用CRAN上的信息轻松构建包作者列表?

sck*_*ott 8

为什么不将Gabor的API用于CRAN包?

例如http://crandb.r-pkg.org/MASS

library("httr")
content(GET("http://crandb.r-pkg.org/MASS"))$Author
[1] "Brian Ripley [aut, cre, cph],\nBill Venables [ctb],\nDouglas M. Bates [ctb],\nKurt Hornik [trl] (partial port ca 1998),\nAlbrecht Gebhardt [trl] (partial port ca 1998),\nDavid Firth [ctb]"
Run Code Online (Sandbox Code Playgroud)


Ben*_*ker 6

取自R开发者网站reverse_dependencies_with_maintainers上的某个点(我现在看不到它):

  description <- sprintf("%s/web/packages/packages.rds",
                          getOption("repos")["CRAN"])
  con <- if(substring(description, 1L, 7L) == "file://") {
       file(description, "rb")
  } else {
      url(description, "rb")
  }
  db <- as.data.frame(readRDS(gzcon(con)),stringsAsFactors=FALSE)
  close(con)
  rownames(db) <- NULL

  head(db$Author)
  head(db$"Authors@R")
Run Code Online (Sandbox Code Playgroud)

在哪里Authors@R存在它可以解析为更好的使用dget()

getAuthor <- function(x){
  if(is.na(x)) return(NA)
  a <- textConnection(x)
  on.exit(close(a))
  dget(a)
}
authors <- lapply(db$"Authors@R", getAuthor)
head(authors)

[[1]]
[1] NA

[[2]]
[1] "Gaurav Sood <gsood07@gmail.com> [aut, cre]"

[[3]]
[1] "Csillery Katalin <kati.csillery@gmail.com> [aut]"
[2] "Lemaire Louisiane [aut]"                         
[3] "Francois Olivier [aut]"                          
[4] "Blum Michael <michael.blum@imag.fr> [aut, cre]"  

[[4]]
[1] NA

[[5]]
[1] "Csillery Katalin <kati.csillery@gmail.com> [aut]"
[2] "Lemaire Louisiane [aut]"                         
[3] "Francois Olivier [aut]"                          
[4] "Blum Michael <michael.blum@imag.fr> [aut, cre]"  

[[6]]
[1] NA
Run Code Online (Sandbox Code Playgroud)