通过ssl读取csv文件与R
现在,全世界都在坚持使用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)
是的 - 请参阅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()
。
非常真实,有一天我们可以更好地解决问题,但严格来说,这里不涉及问题,是吗? ;-) – 2010-11-08 16:47:34
是的,它是相关的,因为可以使用建议的Connections API进行https ssl连接。这样,可以使用url(“https:// ...”)等。 – Jeff 2010-11-08 17:42:19
使用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")
看起来不错。而我通过'tempfile()'方式使用'tempdir()',以便在R存在会话时清除文件。 – 2010-11-08 19:30:28
没有必要把它写入一个文件 - 只需使用textConnection()
require(RCurl)
myCsv <- getURL("https://gist.github.com/raw/667867/c47ec2d72801cfd84c6320e1fe37055ffe600c87/test.csv")
WhatJDwants <- read.csv(textConnection(myCsv))
我需要命名更多的对象“WhatJDwants”。感谢您向我展示如何使用textConnection() – 2010-11-09 12:15:36
我发现,因为Dropbox的改变他们提供https://链接的方式都不是。幸运的是,我不是第一个做出这个发现的,溶液被张贴克里斯托弗·甘拉德在R-博客:
http://www.r-bloggers.com/dropbox-r-data/
这种方法只对我来说,安装repmis包及其依赖后。
鉴于这个问题出现了很多,我一直在研究一个包以无缝处理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),然后从文件扩展名推断文件格式,这样就产生一个数据帧而不需要知道要使用什么功能或如何下载它。
download.file的帮助页面显示“不支持https://连接”。你是否在说明指定选项(download.file.method =“curl”)可以解决这个问题? – 2010-11-08 18:42:13
是的,因为R会'挤出'卷曲而不是使用自己最小的http/ftp客户端代码。 – 2010-11-08 18:46:05
@DWin帮助页面指出你引用的行只引用'method =“internal”'。 – 2010-11-08 18:58:41