R externe Schnittstelle

8

Ich möchte ein R-Paket implementieren, das in C-Code geschrieben ist.

Der C-Code muss:

  • nehmen Sie ein Array (jeden Typs) als Eingabe.
  • erzeugt Array als Ausgabe (von unvorhersehbarer Größe).

Was ist die beste Vorgehensweise beim Implementieren der Array-Weitergabe?

Momentan wird C-Code mit .C() aufgerufen. Es greift auf das Array direkt von R durch den Zeiger zu. Leider kann dies nicht für die Ausgabe getan werden, da die Ausgangsdimensionen im Voraus bekannt sein müssen, was in meinem Fall nicht der Fall ist.

Wäre es sinnvoll, Array von C nach R durch eine Datei zu übergeben? Zum Beispiel in ramfs, wenn Sie Linux verwenden?

Update 1: Hier wurde genau das gleiche Problem besprochen. Dort wurde eine mögliche Option zum Zurückgeben eines Arrays mit unbekannten Dimensionen erwähnt:

Aufteilen der externen Funktion in zwei, vor dem Berechnen des Arrays, aber nachdem die Dimensionen bekannt sind. Der erste Teil würde Dimensionen zurückgeben, dann würde ein leeres Array vorbereitet werden, dann würde der zweite Teil laufen und das Array in R füllen. In meinem Fall sind die vollständigen Dimensionen nur bekannt, wenn der ganze Code ausgeführt wird. Diese Methode würde bedeuten, den C-Code zweimal auszuführen. Eine Schätzung der maximalen Array-Größe ist ebenfalls nicht möglich.

Update 2: Es scheint nur möglich zu sein, stattdessen .Call() zu verwenden, wie es die Macht vorgeschlagen hat. Hier sind einige gute Beispiele: Ссылка .

Danke.

    
alm 21.12.2012, 01:38
quelle

1 Antwort

11
  

Was ist die beste Vorgehensweise beim Implementieren der Array-Weitergabe?

Ist das Paket bereits in ANSI C geschrieben? .C () wäre dann schnell und einfach.

Wenn Sie von Grund auf neu schreiben, empfehle ich .Call () und Rcpp. Auf diese Weise können Sie R-Objekte an Ihren C / C ++ - Code übergeben.

  

Wäre es sinnvoll, Array durch eine Datei zu übergeben?

Nein

Lesen Sie "Schreiben von R-Erweiterungen".

    
power 21.12.2012, 04:25
quelle

Tags und Links