当使用open="r"
创建连接时,它允许逐行读取,这对批量处理大数据流很有用。例如,this script通过一次读取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连接,类似于上面脚本中的示例?
答案 0 :(得分:2)
是的,RCurl可以逐行阅读"。事实上,它总是这样做,但更高级别的功能为了方便起见隐藏了这一点。您可以使用writefunction(和标头的headerfunction)来指定每次libcurl从结果体中收到足够的字节时调用的函数。该功能可以做任何想做的事情。 RCurl包中有几个这样的例子。但这是一个简单的
curlPerform(url = "http://www.omegahat.org/index.html",
writefunction = function(txt, ...) {
cat("*", txt, "\n")
TRUE
})
答案 1 :(得分:0)
一种解决方案是通过curl
手动调用pipe
可执行文件。以下似乎有效。
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)
然而,这不是最理想的,因为curl
可执行文件可能由于各种原因而不可用。通过RCurl / libcurl直接调用此管道会更好。