Meine Gruppe hat ein R-Paket entwickelt, um das Pflanzenwachstum zu simulieren (siehe GitHub-Repository ). Das R-Paket verwendet .Call
die 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)
- Schreiben Sie Tests für vorhandene Funktionen
- Bewahren Sie die C-Bibliothek im
src/
Ordner auf - Platzieren Sie R-spezifischen C-Code (z. B.
SEXP
Laden von R-Bibliotheken usw.) in 'R-Wrapper'-Dateien, denen vorangestellt istR_*
- Erstellen Sie separate Funktionen zum Lesen von Konfigurationsdateien in C.
- Erstellen Sie eine 'Haupt'-C-Funktion, um die Funktionalität in R zu ersetzen
- Schreiben Sie ein Makefile für die C-Bibliothek, das R-Wrapper-Dateien ignoriert
- 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:
- Ist diese Anstrengung fehlgeleitet?
- Übersehen wir mögliche Fallstricke?
- Gibt es eine bessere Möglichkeit, die R- und C-Bibliotheken parallel zu entwickeln?
- Gibt es Beispiele für C-Bibliotheken, die von R-Paketen entkoppelt wurden?
- Wie könnten wir Tests schreiben, um äquivalente Funktionen in R und C zu vergleichen?
Antworten:
Im Allgemeinen ist dies eine gute Idee und viele Pakete tun dies. Vielleicht suchen Sie
RSQLite
nach Inspiration - sie sind verpacktsqlite
und enthalten nur einige Wrapper-Funktionen. Ähnliches gilt fürrhdf5
undhdf5
In Bezug auf Ihre Punkte:
Immer eine gute Idee!
Ja - oder Sie könnten überlegen,
inst/include
ob Sie jemals die Route nur für Header gewählt haben, a laRcpp
Scheint vernünftig genug.
Nicht ganz sicher, was du hier meinst.
Das kommt mir komisch vor. Warum brauchen Sie eine
main
- entwickeln Sie nicht einfach eine Bibliothek mit aufrufbaren Funktionen? Lass R dein seinmain
:)Ja, Sie werden wahrscheinlich einen größeren
Makefile
Aufwand 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.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.
quelle