28

为了庆祝Stack Overflow上第 20,000 个带有Wikipedia 页面中提取 R 发布日期。

我的尝试:

library(XML)
x <- readHTMLTable("http://en.wikipedia.org/wiki/R_(programming_language)")

这不起作用,因为该表实际上是一个列表,而不是 HTML 表。

library(httr)
x <- GET("http://en.wikipedia.org/wiki/R_(programming_language)")
text <- content(x, "parsed")

这提取了文本,但我xpath的生锈了,所以我无法提取相关的发布日期。

我怎样才能做到这一点?


PS。维基百科页面是我能找到的唯一来源,但如果有,请随时使用规范来源发布解决方案。

4

5 回答 5

23

为什么不使用维也纳规范 ftp 档案中的文件日期?

编辑:例如

 lynx -dump http://cran.r-project.org/src/base/R-0/ | grep tgz | grep -v http

为您提供一个可以从 R 解析的表格。为您提供文件大小作为好处。冲洗并重复 R-1 和 R-2 目录。

于 2012-11-26T15:03:15.640 回答
21

编辑为包括 R 版本 3.0.0 及更高版本

Dirk Eddelbuettel 提供了 R 的 .0 版本的规范链接。

下面是一些代码,它从三个单独的 URL 中整理表格,每个主要版本一个,然后绘制它:

library(XML)
library(lattice)


getRdates <- function(){
  url <- paste0("http://cran.r-project.org/src/base/R-", 0:3)
  x <- lapply(url, function(x)readHTMLTable(x, stringsAsFactors=FALSE)[[1]])
  x <- do.call(rbind, x)
  x <- x[grep("R-(.*)(\\.tar\\.gz|\\.tgz)", x$Name), c(-1, -5)]
  x$Release <- gsub("(R-.*)\\.(tar\\.gz|tgz)", "\\1", x$Name)
  x$Date <- as.POSIXct(x[["Last modified"]], format="%d-%b-%Y %H:%M")
  x$Release <- reorder(x$Release, x$Date)
  x
}

x <- getRdates()
dotplot(Release~Date, data=x)

在此处输入图像描述

于 2012-11-26T16:10:57.763 回答
16

有点作弊,既然 Dirk 给了我们一张容易刮的桌子:

library(XML)
theurl <- "http://cran.r-project.org/src/base/R-0/"
h <- htmlParse(theurl)
h <- readHTMLTable(h)
h <- h[[1]]
h <- droplevels(h[-c(1,2,30),])
levels(h$Name) <- gsub(".tgz","",levels(h$Name),fixed=TRUE)

h

给我们:

         Name     Last modified Size Description
3      R-0.49 23-Apr-1997 14:53 959K            
4   R-0.50-a1 22-Jul-1997 16:44 1.0M            
5   R-0.50-a4 10-Sep-1997 14:31 1.0M            
6    R-0.60.0 04-Dec-1997 09:58 1.1M            
7    R-0.60.1 07-Dec-1997 02:59 1.1M            
8    R-0.61.0 22-Dec-1997 00:00 1.1M            
9    R-0.61.1 13-Jan-1998 00:00 1.1M            
10   R-0.61.2 18-Mar-1998 00:00 1.1M            
11   R-0.61.3 03-May-1998 00:00 1.1M            
12   R-0.62.0 15-Jun-1998 00:00 1.2M            
13   R-0.62.1 15-Jun-1998 00:00 1.2M            
14   R-0.62.2 10-Jul-1998 11:59 1.3M            
15   R-0.62.3 28-Aug-1998 11:01 1.3M            
16   R-0.62.4 24-Oct-1998 00:00 1.3M            
17   R-0.63.0 14-Nov-1998 04:57 1.5M            
18   R-0.63.1 05-Dec-1998 02:25 1.5M            
19   R-0.63.2 12-Jan-1999 02:21 1.5M            
20   R-0.63.3 06-Mar-1999 04:27 1.5M            
21   R-0.64.0 08-Apr-1999 01:48 1.5M            
22   R-0.64.1 08-May-1999 02:55 1.9M            
23   R-0.64.2 05-Jul-1999 21:15 1.9M            
24   R-0.65.0 28-Aug-1999 00:18 2.1M            
25   R-0.65.1 07-Oct-1999 01:46 2.2M            
26   R-0.90.0 22-Nov-1999 18:07 2.3M            
27   R-0.90.1 15-Dec-1999 14:05 2.4M            
28   R-0.99.0 07-Feb-2000 13:09 2.8M            
29  R-0.99.0a 09-Feb-2000 12:28 2.8M    
于 2012-11-26T15:23:22.550 回答
7

在已经完成的工作的基础上:

h <- getRdates()
# Find version release rate
library(plyr)
h <- subset(h,select=c(-Description))
Version <- sub("^R-([0-9a-z.-]+)\\.t.*","\\1",h$Name)
h$bigVersion <- as.numeric(sub("^([0-9])\\..+","\\1",Version))
h$smallVersion <- as.numeric(sub("^[0-9]\\.([0-9]+).+","\\1",Version))
h$majorVersion <- as.numeric(paste(h$bigVersion,sprintf( "%02.0f", h$smallVersion ),sep="."))
h <- ddply( h, .(bigVersion,majorVersion), function(x) {
    x$tinyVersion <- seq(nrow(x))
    x
})

# Plot
plot( majorVersion~Date, data=h, pch=".",cex=3)
abline(h=seq(1,2),col="red")

费率

library(lattice)
print(xyplot( smallVersion~Date|bigVersion, data=h, pch=".",cex=3))

格子

并一起比较:

h <- ddply( h, .(bigVersion), function(x) {
   x$bigElapsedTime <- x$Date - min(x$Date)
   x
})

png("c:/temp/Rplot3.png")
plot( smallVersion~bigElapsedTime, data=h, pch=".",cex=3,col=h$bigVersion+1)
dev.off()

都在一个情节上

# How many minor releases per major release

> table(rle(h$majorVersion)$lengths, substring(rle(h$majorVersion)$values,1,1))

    0 1 2
  1 1 0 0
  2 5 5 9
  3 1 1 6
  4 2 4 1
  5 1 0 0
于 2012-11-26T16:42:30.557 回答
4

不再需要为此抓取维基百科。

library(rversions)
r_versions()
于 2016-02-03T21:38:23.620 回答