4

当使用它创建连接时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

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

4

2 回答 2

2

是的,RCurl 可以“逐行阅读”。事实上,它总是这样做,但为了方便起见,更高级别的功能会为您隐藏它。您使用 writefunction(以及 header 的 headerfunction)来指定一个函数,每次 libcurl 从结果主体接收到足够的字节时调用该函数。该功能可以做任何它想做的事情。RCurl 包本身有几个这样的例子。但这里有一个简单的

curlPerform(url = "http://www.omegahat.org/index.html", 
            writefunction = function(txt, ...) { 
                                 cat("*", txt, "\n")
                                 TRUE
                            })
于 2014-09-06T22:30:05.703 回答
1

一种解决方案是通过手动调用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 直接调用这个管道会更好。

于 2014-09-06T21:18:29.850 回答