Wie rufe ich R-Skript von einem anderen R-Skript, beide im gleichen Paket?

8

Ich baue ein Paket, das zwei Hauptfunktionen verwendet. Eine der Funktionen model.R benötigt einen speziellen Simulationstyp sim.R und eine Möglichkeit, die Ergebnisse in einer Tabelle table.R

einzurichten

Wie kann ich in einem gemeinsam nutzbaren Paket die Dateien sim.R und table.R innerhalb von model.R aufrufen? Ich habe source("sim.R") und source("R/sim.R") versucht, aber dieser Aufruf funktioniert nicht innerhalb des Pakets. Irgendwelche Ideen?

Soll ich nur die Codes aus sim.R und table.R in das Skript model.R kopieren und einfügen?

Bearbeiten: Ich habe alle Skripte im R-Verzeichnis, die Dateien DESCRIPTION und NAMESPACE sind alle gesetzt. Ich habe nur mehrere Skripte im R-Verzeichnis. ~ R / hat premodel.R model.R sim.R und table.R . Ich brauche das Skript model.R , um sowohl sim.R als auch table.R functions zu verwenden, die sich im selben Verzeichnis im Paket befinden (z. B. ~ R /).

    
Neue1987 09.07.2015, 21:18
quelle

4 Antworten

2

Wenn Sie ein Paket erstellen möchten, müssen Sie keine Funktionen aufrufen.

Stellen Sie sich zum Beispiel vor, ich möchte ein Paket namens TEST erstellen. Ich werde damit beginnen, ein Verzeichnis (d. H. Ordner) namens TEST zu erzeugen. Innerhalb von TEST werde ich einen anderen Ordnernamen R erstellen, in diesem Ordner werde ich alle R-Skripte einschließen, die die verschiedenen Funktionen im Paket enthalten.

Sie müssen mindestens auch eine BESCHREIBUNG- und NAMESPACE-Datei angeben. Ein Mann (für Hilfedateien) und Tests (für Komponententests) sind auch nett zu enthalten.

Das Erstellen eines Pakets ist ziemlich einfach. Hier ist ein Blog mit einer einfachen Einführung: Ссылка

    
Jacob H 09.07.2015 21:40
quelle
0

Wie andere darauf hingewiesen haben, müssen Sie keine R-Dateien in einem Paket finden. Der Mechanismus zum Laden von Paketen sorgt dafür, dass der Namespace verloren geht und alle exportierten Funktionen verfügbar sind. So müssen Sie sich normalerweise nicht darum kümmern.

Es gibt jedoch Ausnahmen. Wenn Sie mehrere Dateien mit R-Code haben, können Situationen auftreten, in denen die Reihenfolge, in der diese Dateien verarbeitet werden, von Bedeutung ist. Oft ist es egal, oder die von R verwendete Standardreihenfolge ist in Ordnung. Wenn Sie feststellen, dass in Ihrem Paket einige Abhängigkeiten bestehen, die nicht ordnungsgemäß gelöst werden, liegt möglicherweise eine Situation vor, in der eine benutzerdefinierte Verarbeitungsreihenfolge für die R-Dateien erforderlich ist. Die Datei DESCRIPTION bietet zu diesem Zweck das optionale Feld Sortieren an. Listen Sie einfach alle Ihre R-Dateien in der Reihenfolge auf, in der sie verarbeitet werden sollten, um die Abhängigkeiten zu erfüllen.

    
Peter Humburg 11.07.2015 19:40
quelle
0

Da Sie ein Paket erstellen, liegt der Grund, warum Sie Probleme beim Zugriff auf die anderen Funktionen in Ihrem /R Verzeichnis haben, darin, dass Sie zuerst Folgendes tun müssen:

%Vor%

aus dem Arbeitsverzeichnis Ihres Pakets. Nun sollte jede Funktion in Ihrem Paket für jede andere Funktion zugänglich sein. Um das zu beenden, tun Sie Folgendes:

%Vor%

Es sollte jedoch beachtet werden, dass ein einfacher document() -Aufruf ausreicht, um Ihr Problem zu lösen.

    
warship 27.07.2017 01:44
quelle
0

Wenn sich alle Ihre Dateien im R-Verzeichnis befinden, ist jede Funktion im Speicher, nachdem Sie ein Paket-Build oder Load_All erstellt haben. Sie haben möglicherweise Probleme, wenn Sie Code in Dateien haben, die nicht in einer Funktion tho ist.

R lädt Dateien in alphabetischer Reihenfolge.

Normalerweise ist dies kein Problem, da Funktionen ausgewertet werden, wenn sie zur Ausführung aufgerufen werden, nicht zur Ladezeit (ID. Eine Funktion kann eine andere Funktion, die noch nicht definiert ist, auch in derselben Datei verwenden).

Aber wenn Sie Code außerhalb eine Funktion in model.R haben, wird dieser Code sofort beim Laden der Datei ausgeführt, und Ihr Paketaufbau wird normalerweise mit einem

fehlschlagen %Vor%

Wenn dies der Fall ist, fügen Sie den Sparse-Code von model.R in eine Funktion ein, so dass Sie später, wenn das Paket vollständig geladen ist, auch eine externe Bibliothek aufrufen können.

Wenn dieser Codeabschnitt vorhanden ist, um einen Wert zu initialisieren, denken Sie an use_data() , damit R die Ladedaten in die Umgebung für Sie übernimmt. Wenn dieser Codeabschnitt nur interaktiver -Code ist, der zum Testen und Implementieren des Pakets selbst geschrieben wird, sollten Sie überlegen, ihn woanders abzulegen oder ihn trotzdem in eine Funktion zu integrieren.

Wenn Sie wirklich benötigen, dass dieser Code zum Laden ausgeführt wird oder wirklich eine Abhängigkeit zu lösen hat, dann müssen Sie die Vergleichszeile in die DESCRIPTION-Datei einfügen, wie bereits von Peter Humburg angegeben, um R zu zwingen, die Dateireihenfolge zu laden. Roxygen2 kann dir helfen, vor deinen Code zu stellen.

%Vor%

rufen Sie roxygenize() auf, und die Sortierzeile wird für Sie in der DESCRIPTION-Datei generiert.

Aber selbst wenn Sie das tun, wird die externe Bibliothek, von der Sie möglicherweise abhängig sind, noch nicht vom Paket geladen, was zum Zeitpunkt des Builds erneut zu einem Fehler führt.

Schlussendlich sollten Sie Code außerhalb von Funktionen in einer .R-Datei nicht belassen, wenn er sich in einem Paket befindet.

    
TonZ 27.07.2017 08:24
quelle

Tags und Links