2011-05-22 28 views
6

Flexione su músculo RCurl/XML. El código más corto gana. Analizar en R: http://pastebin.com/CDzYXNbGDesafío de RCurl o XML: lea Pastebin en R

de datos debe ser:

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

Buena suerte!

Nota: datos ficticios amablemente proporcionados por esta pregunta: Adding space between bars in ggplot2

Respuesta

5

La misma idea que kohske pero ligeramente más corto y más claro creo

library(XML) 
eval(parse(text=gsub('\r\n','\n',xpathApply(htmlTreeParse('http://pastebin.com/CDzYXNbG',useInternal=T),'//textarea',xmlValue)))) 
+0

Hasta ahora, parece que yo estás a la cabeza, ya que esto capta el marco de datos sin otros caracteres y te permite asignarlo fácilmente a una variable. –

+0

+1 para la claridad de cizallamiento del código. ¡Y sin engaños! –

+0

Elegido por ser el código más corto que utiliza la página especificada. Congratz! –

1

No estoy completamente seguro de lo que está tratando de lograr aquí, pero tal vez lo hace con lo que pide (no usar ningún paquete de lujo, sólo expresiones regulares) :

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) 

También estoy bastante seguro de que esto puede mejorarse de alguna manera, pero hace el trabajo que creo que usted solicitó. Incluso si no: ¡gracias por hacerme querer actualizar mis conceptos básicos de regex!

+0

'Error: la entrada inesperada en "retval <-gsub (" \ n" , "", gsub (""", "\" ", gsub (regexp," \\ 1 ", txtarpart), fijo = VERDADERO), fijo = VERDADERO) \" '¡Uso interesante de la expresión pura pura! –

4

RCurl no es necesario para mi código, ya que los paquetes XML pueden analizar URL para el argumento del archivo.

Por favor ejecute

library(XML) 

antes de los ejemplos a continuación.

Código 1 es 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())) 

Código 2 es más corto, pero creo que esto no es más corto.

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

Como esta pregunta es un tipo de juego, descifre este código.



ACTUALIZADO

Después de mirar excelente solución de @JD largo, aquí es un código más corto:

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

Ahora la pregunta es cómo hacer una cadena URL deseada en el código más corto ;-p

Actualizado nuevamente. Esto es más corto por algunos personajes.

source(sub("m/","m/raw.php?i=","http://pastebin.com/CDzYXNbG"))$va 
+0

Código 1 funciona como se pretendía. El código 2 no se puede asignar a una variable. ¡Buen intento! –

+0

Puede asignar en el código 2. Examine cuidadosamente el código. – kohske

+0

Técnicamente el más corto, pero no utiliza la página especificada. –

4

Ustedes están haciendo de esta manera demasiado duro:

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

OK, por lo que hizo trampa.Pero a partir de la misma URL que podría conseguir el mismo fin:

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

que todavía me pone a la cabeza :)

+0

+1 Me gustan este tipo de solución. – kohske

+0

+1 para cheatin creativo ' –

+0

Me gusta el primero;) –

Cuestiones relacionadas