2010-11-08 13 views
17

Ahora que todo el mundo está buscando usar SSL todo el tiempo (una decisión que tiene mucho sentido) algunos de nosotros que hemos usado github y servicios relacionados para almacenar archivos csv tenemos un poco un pequeño desafío. La función read.csv() no admite SSL al leer desde una URL. Para evitar esto, estoy haciendo un pequeño baile al que me gusta llamar el baile SSL kabuki. Agarro el archivo de texto con RCurl, lo escribo en un archivo temporal y luego lo leo con read.csv(). ¿Hay una manera más suave de hacer esto? ¿Mejor solución?leyendo archivos csv en ssl con R

Aquí está un ejemplo sencillo de la kabuki 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) 

Respuesta

8

Sí - consulte help(download.file) al que apuntan read.csv() y todos sus primos. El argumento no tiene method=:

method método que se utilizará para la descarga de archivos. Actualmente, los métodos de descarga "interno", "wget", "curl" y "lynx" están disponibles, y hay un valor "auto": ver "Detalles". El método también se puede establecer a través de la opción "download.file.method": ver opciones().

y que posteriormente utiliza esta opción para options():

download.file.method: método que se utilizará para download.file. Actualmente, los métodos de descarga "interno", "wget" y "lynx" están disponibles. No hay un valor predeterminado para esta opción, cuando se elige method = "auto": ver download.file.

a su vez al programa externo curl, más que el paquete RCurl.

Editar: Parece que estaba medio correcto y medio equivocado. read.csv() y otros no usan el método seleccionado, uno necesita emplear manualmente download.file() (que luego usa curl u otros métodos seleccionados). Otras funciones que sí usan download.file() (como instalación o actualizaciones de paquetes) se beneficiarán de establecer la opción, pero para la consulta inicial de JD sobre archivos csv sobre https, se necesita un download.file() explícito antes del read.csv() del archivo descargado.

+1

La página de ayuda para download.file dice "https: // las conexiones no son compatibles". ¿Estás diciendo que especificar opciones (download.file.method = "curl") curará ese problema? –

+0

Sí, ya que R luego se 'agrandará' para curl en lugar de usar su propio código de cliente http/ftp mínimo. –

+0

@DWin que la página de ayuda indica que la línea que cita solo se refiere a 'method =" internal "'. –

6

núcleo R debe abrir las conexiones R como una API C. Me he propuesto esto en el pasado:

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

sin respuesta.

+0

Muy cierto y es un problema, es mejor que nos resolvamos algún día, pero no estrictamente hablando, la pregunta aquí, ¿o sí? ;-) –

+3

Sí, está relacionado, porque uno puede hacer una conexión https ssl usando la API de Connections propuesta. De esta forma, se podría usar url ("https: // ..."), etc. – Jeff

12

El uso de los consejos de Dirk para explorar method="" dio como resultado este enfoque un poco más conciso que no depende del paquete RCurl externo.

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

Pero parece que no puedo acaba de establecer options("download.file.method"="curl")

+0

Se ve bien. Y al usar 'tempfile()' de esa manera, usas 'tempdir()' para que el archivo se purgue cuando R existe su sesión. –

12

No es necesario escribir en un archivo - sólo tiene que utilizar textConnection()

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

Necesito nombrar más objetos "WhatJDwants". Gracias por mostrarme cómo usar textConnection() –

0

me encontré con que ya cambió el Dropbox forma en que presentan enlaces con https: // ninguna de las soluciones anteriores funciona más.Afortunadamente, yo no era el primero en hacer este descubrimiento, y una solución fue publicado por Christopher Gandrud en R-bloggers:

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

Este enfoque funciona para mí, después de instalar el paquete repmis y sus dependencias.

1

Dado que esta pregunta surge mucho, he estado trabajando en un paquete para manejar sin problemas los datos HTTPS/SSL. El paquete se llama rio ​​. Una versión de este está en CRAN pero la versión más nueva que ahora admite este is only available on GitHub. Una vez que haya instalado el paquete, se puede leer en los datos en una sola línea:

# 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 

Básicamente, import maneja la descarga manual (utilizando rizo) y después se infiere el formato de archivo de la extensión de archivo, creando así una trama de datos sin necesidad de saber qué función usar o cómo descargarla.

Cuestiones relacionadas