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