2014-01-16 3 views
7

Ich möchte in der Lage sein, eine in R erstellte Matrix im Speicher zu speichern und den Zeiger zurückgeben. Und dann später den Zeiger verwenden, um die Matrix aus dem Speicher zurückzuholen. Ich benutze R Version 3.0.1 (2013-05-16) - "Good Sport" auf Ubuntu 13.01 und Rcpp Version "0.10.6". Ich habe ... versuchtSpeichern und Abrufen von Matrizen im Speicher mit Xptr

// [[Rcpp::export]] 
SEXP writeMemObject(NumericMatrix mat) 
{ 
    XPtr<NumericMatrix> ptr(&mat, true); 
    return ptr; 
} 

// [[Rcpp::export]] 
NumericMatrix getMemObject(SEXP ptr) 
{ 
    XPtr<NumericMatrix> out(ptr); 
    return wrap(out); 
} 

# This returns a pointer 
x <- writeMemObject(matrix(1.0)) 

Aber dies nicht gelingt und stürzt R, wenn ich wieder versuchen

getMemObject(x) 
Error: not compatible with REALSXP 
+2

Dies beantwortet Ihre Frage nicht, aber haben Sie das Paket "bigmemory" ausgecheckt? Es hat ein "big.matrix" -Objekt, das das tut, was du beschreibst. –

+0

Und es verwendet XPtr - siehe die nützliche write-up in der Rcpp Gallery. –

Antwort

4

Der Zeiger Sie XPtr speisen hier die Adresse einer Variablen ist, die writeMemObject lokal ist. Ganz natürlich hast du undefiniertes Verhalten.

Auch externe Zeiger werden normalerweise für Dinge verwendet, die keine R-Objekte sind, und ein NumericMatrix ist ein R-Objekt, so dass es falsch aussieht.

Wenn jedoch aus irgendeinem Grund wollen Sie wirklich ein externer Zeiger auf eine NumericMatrix dann könnte man so etwas tun:

#include <Rcpp.h> 
using namespace Rcpp ; 

// [[Rcpp::export]] 
SEXP writeMemObject(NumericMatrix mat){ 
    XPtr<NumericMatrix> ptr(new NumericMatrix(mat), true); 
    return ptr; 
} 

// [[Rcpp::export]] 
NumericMatrix getMemObject(SEXP ptr){ 
    XPtr<NumericMatrix> out(ptr); 
    return *out ; 
} 

So ist die von new erstellt Zeiger überlebt den Umfang der writeMemObject Funktion.

Sie bitte auch die Änderungen in getMemObject, in Ihrer Version sehen Sie hatte:

XPtr<NumericMatrix> out(ptr); 
return wrap(out); 

Sie sind nicht den Zeiger zu dereferenzieren, wrap würde nur eine Identität und den externen Zeiger zurückgeben anstatt die pointee Ich denke, Du hast gesucht.

2

Was beschreiben Sie so ziemlich das Anwendungsfall für das bigmemory Paket. Michael Kane schrieb eine nice Rcpp Gallery article über seine Verwendung mit Rcpp, die Ihre Fragen beantworten sollte.

Verwandte Themen