2010-06-27 11 views
6

Sto provando a creare un R API for StackOverflow. L'output è gzip. Per esempio:gunzip un file stream in 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" 

C'è un buon modo per gunzip questo in R, a corto di scrivere l'output di file, gunzip'ing, e leggerlo di nuovo in?

+0

Non vedo l'ora che arrivi il pacchetto che è destinato a fallire dall'altra parte di questa ricerca! –

+0

@JD: Assolutamente. Pubblicherò a breve la code page di google e sono felice di assumere collaboratori. Ma la mia sensazione iniziale è che l'API SO non è molto utile. – Shane

risposta

11

Si potrebbe fare:

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

Grazie! Non dimenticare di chiudere la connessione quando hai finito. – Shane

+0

Perché è necessario il doppio 'readLines'? [mbq answer] (http://stackoverflow.com/questions/3128422/gunzip-a-file-stream-in-r/3128738#3128738) funziona anche. – Marek

+0

@Marek: corretto. Ero solo io a provare cose diverse e devo aver incollato qualche comando in più. Grazie per la segnalazione. – nico

5

Prova:

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

Idealmente dovremmo dire al server che siamo in grado di maneggiare contenuto compresso, per saperne dalle intestazioni HTTP che il contenuto è in realtà gzip codificato e poi decomprimere solo se lo è. La libreria Rcurl può fare questo:

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

Questo sarebbe il modo giusto per farlo, ma tieni presente che il team API Overflow dello stack ha [deciso di non rispettare il protocollo HTTP] (http://stackapps.com/questions/729) a questo proposito; leggermente correlato non vedremo [controllo HTTP/1.1 cache corretto] (http://stackapps.com/questions/1028) per ora anche ... –