2010-06-27 15 views
6

Próbuję utworzyć R API for StackOverflow. Dane wyjściowe są zgzipowane. Na przykład:gunzip strumień plików w 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" 

Czy jest to dobry sposób na gunzip to w R, od pisania wyjście do pliku, gunzip'ing go i czytając go z powrotem?

+0

Z niecierpliwością czekam na pakiet, który ma wypaść na drugim końcu tego badania! –

+0

@JD: Absolutnie. Wkrótce opublikuję stronę kodową Google i chętnie wezmę współpracowników. Ale moim początkowym odczuciem jest to, że SO API nie jest zbyt użyteczny. – Shane

Odpowiedz

11

Można zrobić:

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

Dzięki! Nie zapomnij zamknąć połączenia po zakończeniu. – Shane

+0

Dlaczego potrzebne są podwójne "readLines"? [mbq answer] (http://stackoverflow.com/questions/3128422/gunzip-a-file-stream-in-r/3128738#3128738) też działa. – Marek

+0

@Marek: poprawiony. To tylko ja próbowałem różnych rzeczy i musiałem wkleić dodatkowe polecenia. Dziękuję za wskazanie tego. – nico

5

Spróbuj:

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

Idealnie powinniśmy poinformować serwer, że możemy obsłużyć gzipped treści, dowiedzieć się z nagłówków HTTP, że zawartość jest rzeczywiście gzip zakodowany a następnie rozpakuj tylko wtedy, gdy jest. Biblioteka Rcurl może to zrobić:

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

To byłby odpowiedni sposób, aby to zrobić, ale należy pamiętać, że zespół interfejsu API przepełnienia stosu [postanowił nie stosować się do protokołu HTTP] (http://stackapps.com/questions/729) w tym zakresie; nieco powiązane, na razie nie zobaczymy [odpowiedniego kontrolowania pamięci podręcznej HTTP/1.1] (http://stackapps.com/questions/1028) na razie ... –

Powiązane problemy