Подтвердить что ты не робот

Как очистить Интернет за список дат выпуска R?

Чтобы отметить 20 000-й вопрос с тегом страницы Википедии.

Мои попытки:

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. Страница Википедии - единственный источник, который я могу найти, но, пожалуйста, не стесняйтесь публиковать решение, используя канонический источник, если он есть.

4b9b3361

Ответ 1

Отредактировано для включения R версии 3.0.0 и выше

Дирк Эддельбуэттель предоставил каноническую ссылку на выпуски .0 R.

Вот некоторый код, который сопоставляет таблицы из трех отдельных 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)

enter image description here

Ответ 2

Почему вы не используете даты файла в каноническом архиве ftp в Вене?

Изменить: например

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

получает таблицу, которую вы можете проанализировать из R. Получает размер файлов в качестве преимущества. Промыть и повторить для каталогов R-1 и R-2.

Ответ 3

Вид обмана, теперь, когда Дирк дал нам легкую таблицу, чтобы царапать:

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    

Ответ 4

И построим уже выполненную работу:

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")

rates

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

lattice

И сравнивая все вместе:

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()

all on one plot

# 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

Ответ 5

Для этого больше не требуется очищать Википедию.

library(rversions)
r_versions()