2010-11-08 6 views
17

Nun, da die ganze Welt klettert, um SSL die ganze Zeit verwenden (eine Entscheidung, die viel Sinn macht) einige von uns, die Github und verwandte Dienste zum Speichern von CSV-Dateien verwendet haben ein wenig etwas herausfordernd. Die Funktion read.csv() unterstützt SSL nicht beim Lesen von einer URL. Um das zu umgehen mache ich einen kleinen Tanz, den ich gerne den SSL Kabuki Tanz nenne. Ich nehme die Textdatei mit RCurl, schreibe sie in eine temporäre Datei und lese sie dann mit read.csv(). Gibt es einen reibungsloseren Weg dies zu tun? Bessere Work-Arounds?lesen csv-dateien über ssl mit R

Hier ist ein einfaches Beispiel für die SSL Kabuki:

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) 

Antwort

8

Ja - siehe help(download.file), worauf read.csv() und alle seine Cousins ​​zeigen. Das method= Argument dort hat:

method Methode zum Herunterladen von Dateien verwendet werden. Momentan sind die Download-Methoden "internal", "wget", "curl" und "lynx" verfügbar, und es gibt einen Wert "auto": siehe 'Details'. Die Methode kann auch über die Option "download.file.method" eingestellt werden: siehe options().

und Sie dann diese Option, um options() verwenden:

download.file.method: Verfahren zur download.file verwendet werden. Derzeit sind die Download-Methoden "intern", "wget" und "lynx" verfügbar. Es gibt keinen Standardwert für diese Option, wenn method = "auto" ausgewählt ist: siehe download.file.

zum externen Programm zu drehencurl, anstatt das RCurl Paket.

Bearbeiten: Sieht aus, als ob ich halb richtig und halb falsch war. read.csv() und andere tun nicht Verwenden Sie die ausgewählte Methode, muss man manuell verwenden download.file() (die dann curl oder andere ausgewählte Methoden verwendet). Andere Funktionen, die download.file() (wie Paketinstallation oder Updates) verwenden, profitieren von der Einstellung der Option, aber für JDs erste Abfrage bezüglich csv-Dateien über https wird ein expliziter download.file() vor read.csv() der heruntergeladenen Datei benötigt.

+1

Die Hilfeseite für download.file sagt "https: // Verbindungen werden nicht unterstützt". Wollen Sie sagen, dass die Angabe von Optionen (download.file.method = "curl") dieses Problem lösen wird? –

+0

Ja, als R wird dann "ausrollen", um sich zu rollen, anstatt seinen eigenen minimalen HTTP/FTP-Client-Code zu verwenden. –

+0

@DWin diese Hilfeseite gibt an, dass die angegebene Zeile nur auf 'method =" internal "verweist. –

6

R Kern soll die R-Verbindungen als C-API öffnen. Ich habe dies in der Vergangenheit vorgeschlagen:

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

ohne Antwort.

+0

Sehr wahr und ein Problem, das wir besser eines Tages gelöst werden, aber nicht genau bezogen die Frage hier, ist es? ;-) –

+3

Ja, es ist verwandt, weil man mit der vorgeschlagenen Connections-API eine https-SSL-Verbindung herstellen kann. Auf diese Weise könnte man URL ("https: // ..."), etc. verwenden. – Jeff

12

Die Verwendung von Dirks Rat zur Erkundung führte zu diesem etwas prägnanteren Ansatz, der nicht vom externen RCurl-Paket abhängt.

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

Aber es scheint, dass ich nicht nur options("download.file.method"="curl") gesetzt

+0

Sieht gut aus. Und wenn ich 'tempfile()' auf diese Weise benutze, benutze 'tempdir()', damit die Datei gelöscht wird, wenn R ihre Sitzung hat. –

12

Keine Notwendigkeit, in eine Datei zu schreiben - nur verwenden textConnection()

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

Ich muss mehr Objekte "WhatJDwants" nennen. Danke, dass du mir gezeigt hast, wie man textConnection() benutzt –

0

Ich fand, dass da Dropbox die geändert So stellen sie Links zu https: // dar. Keine der obigen Lösungen funktioniert mehr.Zum Glück war ich nicht die erste Entdeckung zu machen, und es wurde eine Lösung von Christopher Gandrud auf r-Blogger gepostet:

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

Dieser Ansatz funktioniert für mich, nach dem repmis Paket und seine Abhängigkeiten zu installieren.

1

Angesichts dieser Frage, die viel aufkommt, habe ich an einem Paket gearbeitet, um HTTPS/SSL-Daten nahtlos zu behandeln. Das Paket heißt rio ​​. Eine Version davon ist auf CRAN, aber die neueste Version, die jetzt unterstützt is only available on GitHub. Sobald Sie das Paket installiert haben, können Sie in Daten in einer Zeile lesen:

# 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 

Grundsätzlich import den manuellen Download Griffe (mit curl) und folgert dann das Dateiformat aus der Dateierweiterung, so dass ein Datenrahmen zu schaffen ohne zu wissen, welche Funktion zu benutzen ist oder wie man sie herunterlädt.