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?
David LeBauer
quelle
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.

Kevin Ushey
quelle
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