2010-06-27 36 views
6

我正在嘗試創建一個R API for StackOverflow。輸出是gzipped。例如:在R中gunzip文件流?

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" 

是否有R鍵用gunzip這是一個好辦法,總之寫輸出到文件,gunzip'ing它,並在回讀的?

+0

我期待的是這個研究的另一端必然會出現這個包! – 2010-06-28 14:21:41

+0

@JD:絕對如此。我會很快發佈google代碼頁,很高興能與合作者見面。但我最初的感覺是,SO API不是很有用。 – Shane 2010-06-28 15:58:12

回答

11

你可以這樣做:

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

謝謝!完成後請不要忘記關閉連接。 – Shane 2010-06-27 20:13:45

+0

爲什麼需要雙'readLines'? [mbq answer](http://stackoverflow.com/questions/3128422/gunzip-a-file-stream-in-r/3128738#3128738)也可以。 – Marek 2010-06-28 08:19:23

+0

@Marek:已更正。這只是我嘗試不同的事情,我必須粘貼一些額外的命令。感謝您指出了這一點。 – nico 2010-06-28 11:08:31

5

嘗試:

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

理想的情況下,我們應該告訴我們可以處理gzip壓縮內容的服務器,從HTTP標頭的內容其實就是gzip的編碼找到然後解壓縮,如果是的話。 Rcurl庫可以做到這一點:

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

這將是正確的做法,但請注意Stack Overflow API團隊在這方面已經[決定不服從HTTP協議](http://stackapps.com/questions/729);略有相關,我們暫時不會看到[正確的HTTP/1.1緩存控制](http://stackapps.com/questions/1028)... – 2010-07-10 08:17:14