2010-11-08 109 views
17

现在,全世界都在坚持使用SSL(一个很有意义的决定),我们中一些使用github和相关服务来存储csv文件的人有一点点有点挑战。从URL读取时,read.csv()函数不支持SSL。为了解决这个问题,我正在做一个我喜欢称之为SSL kabuki舞的小舞。我用RCurl抓取文本文件,将其写入临时文件,然后用read.csv()读取它。有没有更平滑的方式来做到这一点?更好的解决方法?通过ssl读取csv文件与R

这里的SSL歌舞伎的一个简单的例子:

require(RCurl) 
myCsv <- getURL("https://gist.github.com/raw/667867/c47ec2d72801cfd84c6320e1fe37055ffe600c87/test.csv") 
temporaryFile <- tempfile() 
con <- file(temporaryFile, open = "w") 
cat(myCsv, file = con) 
close(con) 

read.csv(temporaryFile) 

回答

8

是的 - 请参阅help(download.file)read.csv()及其所有表兄弟指出。 method=其中的参数有:

method用于下载文件的方法。目前可以使用“internal”,“wget”,“curl”和“lynx”等下载方法,并且有一个值“auto”:请参阅'Details'。该方法也可以通过选项“download.file.method”进行设置:参见options()。

然后您使用此选项options():用于download.file

download.file.method: 方法。目前提供下载方法“内部”,“wget”和“lynx”。当选择method =“auto”时,此选项没有默认值:请参阅download.file。

求助于外部程序curl,而非RCurl包。

编辑:看起来我是半右半错。 read.csv()等人不是使用所选方法,需要手动使用download.file()(然后使用curl或其他所选方法)。使用download.file()的其他功能(例如软件包安装或更新)将从设置选项中获利,但对于JD对通过https的csv文件的初始查询,在下载的文件的read.csv()之前需要明确的download.file()

+1

download.file的帮助页面显示“不支持https://连接”。你是否在说明指定选项(download.file.method =“curl”)可以解决这个问题? – 2010-11-08 18:42:13

+0

是的,因为R会'挤出'卷曲而不是使用自己最小的http/ftp客户端代码。 – 2010-11-08 18:46:05

+0

@DWin帮助页面指出你引用的行只引用'method =“internal”'。 – 2010-11-08 18:58:41

6

ř核心应该打开将R连接,作为C API。没有响应

https://stat.ethz.ch/pipermail/r-devel/2006-October/043056.html

:我提出这个过去。

+0

非常真实,有一天我们可以更好地解决问题,但严格来说,这里不涉及问题,是吗? ;-) – 2010-11-08 16:47:34

+3

是的,它是相关的,因为可以使用建议的Connections API进行https ssl连接。这样,可以使用url(“https:// ...”)等。 – Jeff 2010-11-08 17:42:19

12

使用Dirk的建议来探索method=""导致这个稍微更简洁的方法,它不依赖于外部RCurl包。

temporaryFile <- tempfile() 
download.file("https://gist.github.com/raw/667867/c47ec2d72801cfd84c6320e1fe37055ffe600c87/test.csv",destfile=temporaryFile, method="curl") 
read.csv(temporaryFile) 

但现在看来,我不能只是设置options("download.file.method"="curl")

+0

看起来不错。而我通过'tempfile()'方式使用'tempdir()',以便在R存在会话时清除文件。 – 2010-11-08 19:30:28

12

没有必要把它写入一个文件 - 只需使用textConnection()

require(RCurl) 
myCsv <- getURL("https://gist.github.com/raw/667867/c47ec2d72801cfd84c6320e1fe37055ffe600c87/test.csv") 
WhatJDwants <- read.csv(textConnection(myCsv)) 
+0

我需要命名更多的对象“WhatJDwants”。感谢您向我展示如何使用textConnection() – 2010-11-09 12:15:36

0

我发现,因为Dropbox的改变他们提供https://链接的方式都不是。幸运的是,我不是第一个做出这个发现的,溶液被张贴克里斯托弗·甘拉德在R-博客:

http://www.r-bloggers.com/dropbox-r-data/

这种方法只对我来说,安装repmis包及其依赖后。

1

鉴于这个问题出现了很多,我一直在研究一个包以无缝处理HTTPS/SSL数据。该软件包被称为rio。它的一个版本是在CRAN上,但现在支持这个is only available on GitHub的最新版本。一旦你已经安装的软件包,你可以在一行中的数据读取:

# install and load rio 
library("devtools") 
install_github("leeper/rio") 
library("rio") 

# import 
import("https://gist.github.com/raw/667867/c47ec2d72801cfd84c6320e1fe37055ffe600c87/test.csv") 
## a b 
## 1 1 2 
## 2 2 3 
## 3 3 4 
## 4 4 5 

基本上,import处理手动下载(使用curl),然后从文件扩展名推断文件格式,这样就产生一个数据帧而不需要知道要使用什么功能或如何下载它。