Vorgeschlagene Methode zum Extrahieren einer eigenständigen C-Bibliothek aus einem vorhandenen R-Paket?


8

Meine Gruppe hat ein R-Paket entwickelt, um das Pflanzenwachstum zu simulieren (siehe GitHub-Repository ). Das R-Paket verwendet .Calldie Schnittstelle zu C.

Wir haben entschieden, dass es sich lohnt, eine eigenständige C-Bibliothek zu erstellen. Die beiden Hauptgründe sind 1) die Verwendung vertrauter C-Debugging-Tools und 2) ein großer Teil der Entwickler- / Benutzergemeinschaft ist mit kompilierten Sprachen vertraut (die meisten Modelle in der Klasse sind in C oder Fortran geschrieben). Das R-Paket ist jedoch für viele außerhalb dieser Community zugänglich, daher möchten wir seine Funktionalität beibehalten.

Ich habe einige verwandte Fragen geprüft, z. B. https://stackoverflow.com/q/12328156/199217 , in denen R-Pakete mit C-Bibliotheksabhängigkeiten behandelt werden, aber keine gefunden, die sich speziell mit der Entkopplung eines vorhandenen R-Pakets befasst.

Ein vorgeschlagener Ansatz

(was wir uns bisher ausgedacht haben ... ein Strohmann)

  1. Schreiben Sie Tests für vorhandene Funktionen
  2. Bewahren Sie die C-Bibliothek im src/Ordner auf
  3. Platzieren Sie R-spezifischen C-Code (z. B. SEXPLaden von R-Bibliotheken usw.) in 'R-Wrapper'-Dateien, denen vorangestellt istR_*
  4. Erstellen Sie separate Funktionen zum Lesen von Konfigurationsdateien in C.
  5. Erstellen Sie eine 'Haupt'-C-Funktion, um die Funktionalität in R zu ersetzen
  6. Schreiben Sie ein Makefile für die C-Bibliothek, das R-Wrapper-Dateien ignoriert
  7. Sobald die C-Bibliothek unabhängig und gleichwertig mit dem R-Paket arbeitet, können Sie die C-Funktionen in ein separates Repository verschieben, was eine Abhängigkeit für das R-Paket darstellt

Fragen:

  1. Ist diese Anstrengung fehlgeleitet?
  2. Übersehen wir mögliche Fallstricke?
  3. Gibt es eine bessere Möglichkeit, die R- und C-Bibliotheken parallel zu entwickeln?
  4. Gibt es Beispiele für C-Bibliotheken, die von R-Paketen entkoppelt wurden?
  5. Wie könnten wir Tests schreiben, um äquivalente Funktionen in R und C zu vergleichen?

Ich kenne keine R-Interna, aber im Allgemeinen sollte man sich beim Einbetten einer Bibliothek in einen Interpreter sehr um die Speicherverwaltung (dh die Speicherbereinigung)
kümmern

Antworten:


2

Im Allgemeinen ist dies eine gute Idee und viele Pakete tun dies. Vielleicht suchen Sie RSQLitenach Inspiration - sie sind verpackt sqliteund enthalten nur einige Wrapper-Funktionen. Ähnliches gilt für rhdf5undhdf5

In Bezug auf Ihre Punkte:

Schreiben Sie Tests für vorhandene Funktionen

Immer eine gute Idee!

Bewahren Sie die C-Bibliothek im src/Ordner auf

Ja - oder Sie könnten überlegen, inst/includeob Sie jemals die Route nur für Header gewählt haben, a laRcpp

Platzieren Sie R-spezifischen C-Code (z. B. SEXPLaden von R-Bibliotheken usw.) in 'R-Wrapper'-Dateien, denen vorangestellt istR_*

Scheint vernünftig genug.

Erstellen Sie separate Funktionen zum Lesen von Konfigurationsdateien in C.

Nicht ganz sicher, was du hier meinst.

Erstellen Sie eine 'Haupt'-C-Funktion, um die Funktionalität in R zu ersetzen

Das kommt mir komisch vor. Warum brauchen Sie eine main- entwickeln Sie nicht einfach eine Bibliothek mit aufrufbaren Funktionen? Lass R dein sein main:)

Schreiben Sie ein Makefile für die C-Bibliothek, das R-Wrapper-Dateien ignoriert

Ja, Sie werden wahrscheinlich einen größeren MakefileAufwand benötigen , um dies zu handhaben. Ich schlage erneut vor, den Quellcode für RSQLite zu lesen, und auch R-Exts können hilfreich sein.

Sobald die C-Bibliothek unabhängig und gleichwertig mit dem R-Paket arbeitet, können Sie die C-Funktionen in ein separates Repository verschieben, was eine Abhängigkeit für das R-Paket darstellt

Ja, dies erscheint sinnvoll. Lassen Sie das R-Paket den C-Quellcode nach Bedarf abrufen, wenn Sie das Paket erstellen / entwickeln. Auf diese Weise können sie effektiv entkoppelt werden.


Vielen Dank. 1) "Separate Funktionen zum Lesen von Konfigurationsdateien in C" ist eine Alternative zu unserem aktuellen Ansatz, bei dem xmlToList in R zum Lesen einer Eingabedatei verwendet wird. 2) Als "Haupt" möchten wir in der Lage sein, durch Übergeben einer Konfiguration vollständig in C zu berechnen Datei zur ausführbaren Datei.
David LeBauer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.