سؤال

الآن وبعد أن أصبح العالم كله يتسلق لاستخدام 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)
هل كانت مفيدة؟

المحلول

نعم - انظر help(download.file) الذي يشير إليه read.csv() وجميع أبناء عمومتها. ال method= الحجة هناك:

method طريقة لاستخدامها لتنزيل الملفات. تتوفر طرق تنزيل حاليًا "Internal" و "Wget" و "Curl" و "Lynx" ، وهناك قيمة "Auto": انظر "التفاصيل". يمكن أيضًا تعيين الطريقة من خلال خيار "download.file.method": انظر Options ().

ثم تستخدم هذا الخيار ل options():

download.file.method:طريقة لاستخدامها في التنزيل. تتوفر أساليب تنزيل حاليًا "Internal" و "Wget" و "Lynx". لا يوجد أي افتراضي لهذا الخيار ، عند اختيار Method = "Auto": انظر Download.File.

للتحول إلى البرنامج الخارجي curl, ، بدلا من حزمة rcurl.

يحرر: يبدو أنني كنت نصف اليمين والنصف. read.csv() وآخرون يفعلون ليس استخدم الطريقة المحددة ، يحتاج المرء إلى توظيفه يدويًا download.file() (الذي يستخدم بعد ذلك curl أو غيرها من الطرق المحددة). وظائف أخرى تستخدم download.file() (مثل تثبيت الحزمة أو التحديثات) سوف يستفيد من إعداد الخيار ، ولكن بالنسبة للاستعلام الأولي لـ JD فيما يتعلق بملفات CSV عبر HTTPS ، صريح download.file() مطلوب من قبل read.csv() من الملف الذي تم تنزيله.

نصائح أخرى

لا حاجة لكتابته إلى ملف - ما عليك سوى استخدام TextConnection ()

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

استخدام نصيحة ديرك لاستكشاف 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")

يجب أن يفتح R core اتصالات R كأبي C. لقد اقترحت هذا في الماضي:

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

بدون استجابة.

بالنظر إلى أن هذا السؤال يظهر كثيرًا ، فقد كنت أعمل على حزمة للتعامل مع بيانات HTTPS/SSL بسلاسة. تسمى الحزمة ريو. إصدار منه على Cran ولكن أحدث إصدار يدعم هذا الآن متوفر فقط على جيثب. بمجرد تثبيت الحزمة ، يمكنك القراءة في البيانات في سطر واحد:

# 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) ثم يحقق تنسيق الملف من ملحق الملف ، وبالتالي إنشاء DataFrame دون الحاجة إلى معرفة الوظيفة التي يجب استخدامها أو كيفية تنزيلها.

لقد وجدت أنه نظرًا لأن Dropbox غيرت الطريقة التي يقدمون بها روابط باستخدام HTTPS: // لا يعمل أي من الحلول المذكورة أعلاه بعد الآن. لحسن الحظ ، لم أكن أول من حقق هذا الاكتشاف ، وتم نشر حل من قبل كريستوفر غاندرود على R-Blogers:

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

هذا النهج يعمل بالنسبة لي ، بعد تثبيت حزمة repmis وتبعياتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top