2013-02-14 2 views
12

Gibt es einen vordefinierten Speicherort, an dem ein R-Paket zwischengespeicherte Daten speichern könnte? Die Daten sollten über Sitzungen hinweg bestehen bleiben. Ich habe darüber nachgedacht, ein Unterverzeichnis von ${R_LIBS_USER}/package_name zu erstellen, aber ich bin mir nicht sicher, ob dies portabel ist und ob dies "erlaubt" ist, wenn mein Paket systemweit installiert ist.Gibt es einen dauerhaften Speicherort, der immer beschreibbar ist, der als Datencache von einem Paket verwendet werden kann?

Die Idee ist folgende: Erstellen Sie ein R-Skript mydata.R im data Unterverzeichnis des Pakets, das durch den Aufruf data(mydata) ausgeführt werden würde (entsprechend der Dokumentation von data()). Dieses Skript würde die Daten aus dem Internet laden und zwischenspeichern, wenn es zuvor noch nicht zwischengespeichert wurde. (Wenn die Daten bereits zwischengespeichert wurden, wird der Cache verwendet.) Außerdem wird eine Funktion bereitgestellt, die den Cache ungültig macht und/oder überprüft, ob eine neuere Version der Daten online verfügbar ist.

Dies ist aus der Dokumentation von data():

, die derzeit vier Formate von Datendateien werden unterstützt:

  1. Dateien mit der Endung '.R' oder '.r' Quelle ist() d in, wobei das R-Arbeitsverzeichnis vorübergehend in das Verzeichnis mit der entsprechenden Datei geändert wurde. (Daten stellt sicher, dass die utils-Paket angebracht ist, falls es über utils :: Daten ausgeführt worden war.)

  2. ...

der Tat eine Datei fortytwo.R im data Unterverzeichnis zu schaffen eine Verpackung mit folgendem Inhalt:

fortytwo = data.frame(answer=42) 

und dann data(fortytwo) Ausführung erzeugt einen Datenrahmen variable fortytwo. Nun ist die Frage: Wo würde fortytwo.R die Daten zwischenspeichern, wenn es schwer zu berechnen wäre?

BEARBEITEN: Ich denke über das Erstellen von zwei Paketen: Ein "Daten" -Paket, das die Daten bereitstellt, und ein "Code" -Paket, das darauf funktioniert. Die Frage betrifft das "Daten" -Paket: Wo kann es Dateien in einem Benutzerspeicher speichern, so dass es in R-Sitzungen persistent ist und von verschiedenen R-Projekten aus zugänglich ist?

Bezug: Package that downloads data from the internet during installation.

+2

Sie möchten vielleicht einen Blick auf https://github.com/hadley/rappdirs werfen - es ist ein Port von AppDirs, einer Python-Bibliothek, die versucht, die richtigen Verzeichnisse auf betriebssystemspezifische Weise zu finden. – hadley

+0

Ich versuche nur zu verdeutlichen: Meinst du, wo können Daten gespeichert werden, nachdem sie von einem R-Skript verarbeitet wurden? Mit anderen Worten, geht es in Ihrer Frage wirklich um die Daten aus dem Datenpaket oder um die Daten, die als Ergebnis einer Verarbeitung generiert wurden? Es klingt * wie letzteres. – A5C1D2H2I1M1N2O1R2T1

+0

@hadley: Gibt es eine Chance, dass dies in naher Zukunft auf CRAN erscheinen wird? Wenn es keine R-spezifische Möglichkeit dafür gibt (wie in ein Unterverzeichnis von $ {R_USER_LIBS}), verwende ich gerne dein Paket. – krlmlr

Antwort

-2

Haben Sie sich In-Memory-Datenbanken angesehen? H2 & Redis haben Bindungen in R über RH2 & rredis- beide ermöglichen es Ihnen, die Daten über R-Sitzungen zu teilen, bis die Erstellung Sitzung lebt. Um es in nicht-parallelen Sitzungen bestehen zu lassen, müssen Sie Ihre Daten auf die Festplatte schreiben (vorausgesetzt, Sie können sie nicht im Handumdrehen neu erstellen, was den Zweck dieser Frage zunichte machen würde), und ich glaube den Daten Paket wäre eine gute Option. Auf diese Weise können Sie eine Aktualisierungsfunktion hinzufügen, die jedes Mal initialisiert wird, wenn Sie eines der Pakete laden (d. H. Wenn das Code-Paket die richtigen Abhängigkeiten hat)

Ein Beispiel ist RWeka & RWekaJars-Pakete. Schaut sie auf CRAN an, und es sollte ziemlich einfach sein zu verstehen, wie sie funktionieren.

+0

Ich kann die Daten auf Festplatte im nativen Format von R schreiben. Ich muss nur einen Platz finden, wo ich sie hinstellen kann, damit andere R-Sitzungen es dort finden. – krlmlr

+0

Wie ich schon sagte, verwende ich In-Memory-Datenbanken. H2 & redis dienen mir gut. – jackStinger

1

Es gibt keinen absolut definierten Speicherort für package-spezifische persistente Zwischenspeicherung in R.Die R.cache package bietet jedoch eine Schnittstelle zum Erstellen und Verwalten von zwischengespeicherten Daten. Es sieht so aus, als könnte es für Ihr Szenario nützlich sein.

Wenn Benutzer R.cache laden (library(R.cache)), erhalten sie die folgende Meldung:

The R.cache package needs to create a directory that will hold cache files. 
It is convenient to use one in the user's home directory, because it remains 
also after restarting R. Do you wish to create the '~/.Rcache/' directory? If 
not, a temporary directory (/tmp/RtmpqdUcbP/.Rcache) that is specific to this 
R session will be used. [Y/n]: 

Sie können dann wählen, das Cache-Verzeichnis in ihrem Home-Verzeichnis zu erstellen, die vermutlich persistent ist, oder ein erstellen sitzungsspezifisches Verzeichnis Wenn Sie Ihr Datenpaket von R.cache abhängig machen, können Sie in seiner Hook-Funktion .onLoad() nach dem Vorhandensein des zwischengespeicherten Objekts suchen und die Daten herunterladen, wenn es nicht vorhanden ist. Alternativ können Sie dies auch so machen, wie es in Ihrer eigenen Frage vorgeschlagen wurde.

Verwandte Themen