2016-02-18 10 views
7

Ich möchte in der Lage sein, von einer beliebigen R-Verbindung (im Sinne von ?connections) zu lesen, die vom Benutzer an eine R-Funktion übergeben werden würde und dann nach unten einige C-Code über .Call.R: Lesen von einer bestehenden Verbindung im kompilierten Code

Die R-API gibt in der Datei R_ext/Connections.h eine Funktion R_ReadConnection an, die einen Zeiger auf eine Rconn-Struktur als erstes Argument verwendet, und tut, was ich will. Die Struktur selbst ist auch in diesem Header definiert, aber ich sehe keine Möglichkeit, eine Struktur dieses Typs abzurufen, abgesehen von getConnection (die C-Funktion), die nicht Teil der API ist. Soweit ich das beurteilen kann, zeigt der mit der Verbindung verknüpfte externe Zeiger auch nicht direkt auf die Struktur.

Also, könnte mir bitte jemand sagen, ob es eine unterstützte Möglichkeit gibt, eine geeignete in einen Zeiger auf die zugehörige Rconn Struktur zu konvertieren?

Vielen Dank im Voraus.

Antwort

1

Die R-API-Funktion R_GetConnection() wurde hinzugefügt in R 3.3.0, wie documented in NEWS zu verwenden. Es führt die Umwandlung von zu Zeiger zu Rconn (a.k.a. Rconnection) durch. Daher ist die Lösung jetzt

#include <R_ext/Connections.h> 

SEXP myfunction (SEXP conn_) 
{ 
    Rconnection conn = R_GetConnection(conn_); 
    // Do something with the connection 

    return R_NilValue; 
} 
+0

Wie lautet der richtige Weg, um dies von R aus aufzurufen? Wäre es '.Call (" myfunction ", textConnection (LETTERS))?' – logworthy

+0

Ja, das sollte funktionieren. –

1

Ich glaube nicht, dass es (das ist ein Versehen, denke ich). Die Abhilfe besteht darin, einen entsprechenden Prototyp zu erklären und es

Rconnection getConnection(int n); 

SEXP connect_me(SEXP conn) { 
    getConnection(INTEGER(conn)[0]); 
    return R_NilValue; 
} 
+0

Danke. Das funktioniert funktional, aber R beschwert sich über Nicht-API-Aufrufe, also denke ich, dass diese Route für ein veröffentlichtes Paket nicht verfügbar ist. –