2016-02-18 16 views
7

Mi piacerebbe essere in grado di leggere da una connessione R arbitraria (nel senso di ?connections), che verrebbe passata a una funzione R dall'utente e quindi giù in qualche codice C tramite .Call.R: Lettura da una connessione esistente nel codice compilato

L'API R, nel file R_ext/Connections.h, specifica una funzione, R_ReadConnection, che accetta un puntatore a una struttura Rconn come primo argomento e fa ciò che voglio. La struttura stessa è anche definita in quell'intestazione, ma non vedo il modo di recuperare una struttura di quel tipo, a parte lo getConnection (la funzione C), che non fa parte dell'API. Per quanto posso dire, anche il puntatore esterno associato alla connessione non punta direttamente alla struct.

Quindi, qualcuno potrebbe dirmi se esiste un modo supportato per convertire un opportuno SEXP in un puntatore alla struttura associata Rconn?

Grazie in anticipo.

risposta

1

la R API funzione R_GetConnection() inserito in R 3.3.0, come documented in NEWS. Esegue la conversione da SEXP al puntatore a Rconn (a.k.a Rconnection). Quindi, la soluzione è ora

#include <R_ext/Connections.h> 

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

    return R_NilValue; 
} 
+0

Qual è il modo corretto per chiamare questo da R? Sarebbe '.Call (" miafunzione ", textConnection (LETTERS))?' – logworthy

+0

Sì, dovrebbe funzionare. –

1

Non penso che ci sia (questa è una svista, penso). La soluzione è dichiarare un prototipo e la userà

Rconnection getConnection(int n); 

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

Grazie. Funziona funzionalmente, ma R si lamenta delle chiamate non API, quindi immagino che questa rotta sia disponibile per un pacchetto pubblicato –

Problemi correlati