2010-06-27 11 views
6

Estoy tratando de crear una R API for StackOverflow. La salida tiene gzip. Por ejemplo:gunzip una secuencia de archivo en R?

readLines("http://api.stackoverflow.com/0.9/stats/", warn=F) 
[1] "\037‹\b"                                                                       
[2] "\030\002úØÛy°óé½\036„iµXäË–[<üt—Zu[\\VmÎHî=ÜÛݹ×ýz’Í.äûû÷>ý´\a\177Ýh÷\017îÝÛÙwßÚáÿþ«¼þý\027ÅrÝæÔlgüÀëA±\017›ìŽï{M¤û.\020\037�Ë\"¿’\006³ì\032„Úß9¸ÿ`¼ç÷³*~ÿKêˆð¡\006v¦ð²ýô£�ñÃ�ì+ôU�_\026滽�]êt¼·?ÞûÈ4ù%\016~S0^>àe¶ÀG\037½n³éÛôKê缬®‚\016Êê¢úý×u‰fó¶]=º{·aΚŽ—y{·©î\026‹‹»h5^-/‚W1 |9[UŲõ^§�Ç" 
[3] ":¬´¿1M\177ð\"0íö¹ñ…YÞLëbÕ*!~â\027\036§çU�®êê¢ÎˆµhòýæÅ´Zn\036S¶Z•ùv[­§óm´î�"                                                      
[4] "Í™t˪^d¥£·üÂ?¾ÿ\033'¿$ù\177" 

¿Hay una buena manera de gunzip presente en R, corta de escribir la salida a un archivo, gunzip'ing, y leer de nuevo en?

+0

Estoy esperando el paquete que seguramente saldrá al otro lado de esta investigación. –

+0

@JD: Absolutamente. Publicaré la página de códigos de Google en breve y estoy feliz de contratar colaboradores. Pero mi sensación inicial es que SO API no es muy útil. – Shane

Respuesta

11

Se podría hacer:

conn <- gzcon(url("http://api.stackoverflow.com/0.9/stats/")) 
data <- readLines(conn) 
+0

¡Gracias! No te olvides de cerrar la conexión cuando hayas terminado. – Shane

+0

¿Por qué se necesita doble 'readLines'? [respuesta mbq] (http://stackoverflow.com/questions/3128422/gunzip-a-file-stream-in-r/3128738#3128738) también funciona. – Marek

+0

@Marek: corregido. Eso fue solo yo probando cosas diferentes y debo haber pegado un comando extra. Gracias por señalar eso. – nico

5

Probar:

p <- gzcon(url("http://api.stackoverflow.com/0.9/stats/")) 
readLines(p) 
4

Idealmente debería indicar al servidor que podemos manejar el contenido gzip, averiguar a través de las cabeceras HTTP que el contenido es en realidad gzip codificada y luego descomprimir solo si lo es. La biblioteca de Rcurl puede hacer esto:

library(Rcurl) 
getURL("http://api.stackoverflow.com/0.9/stats/", 
     .opts=list(encoding="identity,gzip") 
+1

Esa sería la manera correcta de hacerlo, pero tenga en cuenta que el equipo API de Stack Overflow ha [decidido no obedecer el protocolo HTTP] (http://stackapps.com/questions/729) en este sentido; ligeramente relacionado, no veremos [control de caché HTTP/1.1 adecuado] (http://stackapps.com/questions/1028) por el momento también ... –

Cuestiones relacionadas