从R中的HTTPS连接逐行读取

从R中的HTTPS连接逐行读取,r,http,rcurl,httr,R,Http,Rcurl,Httr,当使用open=“r”创建连接时,它允许逐行读取,这对于批量处理大型数据流非常有用。例如,通过一次读取100行来解析一个相当大的gzip JSON HTTP流。但不幸的是,R不支持SSL: > readLines(url("https://api.github.com/repos/jeroenooms/opencpu")) Error in readLines(url("https://api.github.com/repos/jeroenooms/opencpu")) : cann

当使用
open=“r”
创建连接时,它允许逐行读取,这对于批量处理大型数据流非常有用。例如,通过一次读取100行来解析一个相当大的gzip JSON HTTP流。但不幸的是,R不支持SSL:

> readLines(url("https://api.github.com/repos/jeroenooms/opencpu"))
Error in readLines(url("https://api.github.com/repos/jeroenooms/opencpu")) : 
  cannot open the connection: unsupported URL scheme

RCurl
httr
包确实支持HTTPS,但我认为它们无法创建类似于
url()
的连接对象。是否有其他方法可以逐行读取HTTPS连接,类似于上面脚本中的示例?

一种解决方案是通过
管道手动调用
curl
可执行文件。下面的方法似乎有效

library(jsonlite)
stream_https <- gzcon(pipe("curl https://jeroenooms.github.io/files/hourly_14.json.gz", open="r"))
batches <- list(); i <- 1
while(length(records <- readLines(gzstream, n = 100))){
  message("Batch ", i, ": found ", length(records), " lines of json...")
  json <- paste0("[", paste0(records, collapse=","), "]")
  batches[[i]] <- fromJSON(json, validate=TRUE)
  i <- i+1
}
weather <- rbind.pages(batches)
rm(batches); close(gzstream)
library(jsonlite)
是的,RCurl可以“逐行读取”。事实上,它总是这样做,但是为了方便起见,更高级别的函数隐藏了这一点。您可以使用writefunction(header的headerfunction)指定一个函数,每当libcurl从结果体接收到足够的字节时,就会调用该函数。这个函数可以做任何它想做的事情。在RCurl包本身中有几个这样的例子。但这里有一个简单的例子

curlPerform(url = "http://www.omegahat.org/index.html", 
            writefunction = function(txt, ...) { 
                                 cat("*", txt, "\n")
                                 TRUE
                            })

+1:请注意,
?url
表示Windows(在某些情况下)支持
“https://”
,并将用户指向
方法
参数,该参数设置为
“wget”
和/或
“lynx”
下载文件
(但这些并不能解决Jeron的问题)。
读取行(文本连接(内容(获取("https://api.github.com/repos/jeroenooms/opencpu),as=“text”))
可能会起作用,但是
GET
将首先抓取整个文件。
httr
现在支持将内容下载到磁盘,这可能不是最佳选择,但如果对象无法放入内存,则是另一种选择。为供将来参考,我们提供了一个示例: