Подтвердить что ты не робот

Чтение csv файлов через ssl с R

Теперь, когда весь мир пытается использовать SSL все время (решение, которое имеет большой смысл), некоторые из нас, которые использовали github и связанные сервисы для хранения файлов csv, имеют немного сложную задачу. Функция read.csv() не поддерживает SSL при чтении с URL-адреса. Чтобы обойти это, я делаю небольшой танец, мне нравится называть табло SSL kabuki. Я захватываю текстовый файл с помощью RCurl, записываю его во временный файл, а затем читаю его с помощью read.csv(). Есть ли более плавный способ сделать это? Лучше работать?

Вот простой пример 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)
4b9b3361

Ответ 1

Да - см. help(download.file), на который указывает read.csv() и все его кузены. Аргумент method= имеет:

method Метод, который будет использоваться для загрузки файлов. В настоящее время доступны методы загрузки "internal", "wget", "curl" и "lynx", и есть значение "auto": см. "Детали. Этот метод также можно установить с помощью опции" download.file.method": см. Параметры().

а затем используйте эту опцию options():

download.file.method:    Метод, который будет использоваться для файла download.file. В настоящее время доступны методы загрузки "внутренний", "wget" и "lynx". Для этой опции нет значения по умолчанию, когда выбран метод = "авто": см. Файл download.file.

чтобы перейти к внешней программе curl, а не к пакету RCurl.

Изменить: Похоже, я был полуправым и полузаносящим. read.csv() и другие не используют выбранный метод, нужно вручную использовать download.file() (который затем использует curl или другие выбранные методы). Другие функции, которые используют download.file() (например, установка пакета или обновления), получат выгоду от установки параметра, но для первоначального запроса JD, касающегося файлов csv по https, перед read.csv() загруженного файла требуется явное download.file().

Ответ 2

Использование совета 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")

Ответ 3

Не нужно записывать его в файл - просто используйте textConnection()

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

Ответ 5

Учитывая, что этот вопрос возникает очень часто, я работал над пакетом, который позволяет без проблем обрабатывать данные HTTPS/SSL. Пакет называется rio. Версия его находится на CRAN, но самая новая версия, которая теперь поддерживает эту доступна только в 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), а затем выводит формат файла из расширения файла, создавая таким образом фрейм данных, не требуя знать, какую функцию использовать или как его загрузить.

Ответ 6

Я обнаружил, что, поскольку Dropbox изменил способ передачи ссылок с помощью https://ни одно из вышеперечисленных решений не работает. К счастью, я не первый, кто сделал это открытие, и решение было опубликовано Кристофером Гандрудом на r-bloggers:

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

Этот подход работает для меня после установки пакета repmis и его зависимостей.