RCurl или XML Challenge: чтение Pastebin в R - PullRequest
6 голосов
/ 22 мая 2011

Согните мышцы RCurl / XML. Самый короткий код выигрывает. Разобрать в R: http://pastebin.com/CDzYXNbG

Данные должны быть:

structure(list(Treatment = structure(c(2L, 2L, 1L, 1L), .Label = c("C", 
"T"), class = "factor"), Gender = c("M", "F", "M", "F"), Response = c(56L, 
58L, 6L, 63L)), .Names = c("Treatment", "Gender", "Response"), row.names = c(NA, 
-4L), class = "data.frame")

Удачи!

Примечание: фиктивные данные любезно предоставлены этим вопросом: Добавление пробела между столбцами в ggplot2

Ответы [ 4 ]

5 голосов
/ 22 мая 2011

Та же идея, что и в Кохске, но немного короче и яснее, я думаю

library(XML)
eval(parse(text=gsub('\r\n','\n',xpathApply(htmlTreeParse('http://pastebin.com/CDzYXNbG',useInternal=T),'//textarea',xmlValue))))
4 голосов
/ 23 мая 2011

Вы, ребята, делаете этот путь слишком усердно:

eval(parse(file("http://pastebin.com/raw.php?i=CDzYXNbG")))

ОК, так что я обманул.Но, начиная с того же URL-адреса, вы можете получить тот же результат:

eval(parse(file(paste("http://pastebin.com/raw.php?i=", strsplit("http://pastebin.com/CDzYXNbG", "/")[[1]][4], sep=""))))

Что по-прежнему ставит меня в лидеры:)

4 голосов
/ 22 мая 2011

RCurl не требуется для моего кода, так как пакеты XML могут анализировать URL-адрес для аргумента файла.

Пожалуйста, выполните

library(XML)

перед примерами ниже.

Код 1 - oneliner :

eval(parse(text=htmlTreeParse("http://pastebin.com/CDzYXNbG",handlers=(function(){qt <- NULL;list(textarea=function(node,...){qt<<-gsub("[\r\n]", "", unclass(node$children$text)$value);node},.qt=function()qt)})())$.qt()))

Код 2 короче, но я думаю, что он не самый короткий.

htmlTreeParse("http://pastebin.com/CDzYXNbG",h=list(textarea=function(n)z<<-gsub("[\r\n]","",unclass(n$c$t)$v)));eval(parse(text=z))

Поскольку этот вопрос является разновидностью игры, пожалуйста, расшифруйте этот код.



ОБНОВЛЕНО

Посмотрев на отличное решение @JD Long, вот краткий код:

eval(parse(file(sub("m/","m/raw.php?i=","http://pastebin.com/CDzYXNbG"))))

Теперь вопрос в том, как сделать нужную строку URL в самом коротком коде; -p

Обновлено снова. Некоторые персонажи короче.

source(sub("m/","m/raw.php?i=","http://pastebin.com/CDzYXNbG"))$va
1 голос
/ 22 мая 2011

Я не совсем уверен, чего вы здесь добиваетесь, но, возможно, выполняет то, о чем вы просите (не используя какие-то необычные пакеты, просто регулярное выражение):

fullText<-(paste(readLines("http://pastebin.com/CDzYXNbG"), collapse="\n"))
regexp<-"<textarea[^>]*id=\"paste_code\"[^>]*>(.*)</textarea>"
txtarpos<-regexpr(regexp, fullText)
txtarstrt<-txtarpos[1]
txtarlen<-unlist(attributes(txtarpos)["match.length"])
txtarstp<-txtarstrt+txtarlen
txtarpart<-substr(fullText, txtarpos[1], txtarstp)
retval<-gsub("\n", "", gsub("&quot;", "\"", gsub(regexp, "\\1", txtarpart), fixed=TRUE), fixed=TRUE)
cat(retval)

Я также почти уверен, что это может быть несколько улучшено, но это делает ту работу, которую, я думаю, вы просили. Даже если нет: спасибо, что заставил меня захотеть обновить основы регулярных выражений!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...