2010-06-27 3 views
6

Я пытаюсь создать R API for StackOverflow. Выходной сигнал является gzipped. Например:gunzip поток файлов в 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" 

Есть хороший способ разархивировать это в R, короткие записи вывода в файл, gunzip'ing его, и читать его обратно?

+0

Я с нетерпением жду пакета, который обязательно выпадет на другом конце этого исследования! –

+0

@JD: Абсолютно. В скором времени я опубликую кодовую страницу google и с удовольствием возьму на себя сотрудников. Но мое первоначальное ощущение состоит в том, что SO API не очень полезен. – Shane

ответ

11

Вы можете сделать:

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

Спасибо! Не забудьте закрыть соединение, когда закончите. – Shane

+0

Зачем нужен двойной 'readLines'? [mbq answer] (http://stackoverflow.com/questions/3128422/gunzip-a-file-stream-in-r/3128738#3128738) тоже работает. – Marek

+0

@Marek: исправлено. Это было просто я пробую разные вещи, и я, должно быть, добавил какую-то дополнительную команду. Спасибо что подметил это. – nico

5

Try:

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

В идеале мы должны сообщить серверу, что мы можем справиться с сжатым содержанием, выяснить, из HTTP-заголовков, содержание фактически GZIP закодированное а затем распаковывать, только если это так. Библиотека Rcurl может сделать это:

+1

Это был бы правильный способ сделать это, но имейте в виду, что команда API переполнения стека [приняла решение не подчиняться HTTP-протоколу] (http://stackapps.com/questions/729) в этом отношении; немного связанных, мы пока не увидим [надлежащее управление кешем HTTP/1.1] (http://stackapps.com/questions/1028) ... –