2017-12-08 1 views
1

私はC++またはRcppエキスパートではないが、RからC++データメンバーにアクセスすることは可能ですか?以下の私の試みは失敗します。C++オブジェクトデータメンバーへのアクセスR

TEST.CPP

#include <Rcpp.h> 
using namespace Rcpp; 

class myclass { 
private: 
    int k; 
public: 
    myclass(int &n) : k(n){} 
    int getk() const {return k;} 
}; 

typedef myclass* pmyclass; 

// [[Rcpp::export]] 
XPtr<pmyclass> new_myclass(NumericVector n_) { 
    int n = as<int>(n_); 
    myclass x(n); 
    return(XPtr<pmyclass>(new pmyclass(&x))); 
} 

// [[Rcpp::export]] 
NumericVector getk(SEXP xpsexp){ 
    XPtr<pmyclass> xp(xpsexp); 
    pmyclass x = *xp; 
    return wrap(x -> getk()); 
} 

をtest.R

library(Rcpp) 

sourceCpp('./cpp_attempt/live_in_cpp/minimal_fail/test.cpp') 

ptr <- new_myclass(10) 

getk(ptr) 
#19274768 
+3

はいすることができますを使用しますポインタ(あなたの例はかなり正しいわけではありませんが)またはもちろん手動でgetterとsetter関数をクラスのインスタンスに渡します(そのためにもn Rから尋ねられたctorをeed)。 –

+0

Rcppモジュールを見ていきます。あなたのhttps://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-modules.pdfドキュメンテーションがそれをカバーしているかのように見えます。ありがとうございました。 –

+0

はい、Rcpp(とそのテスト)の内部の例を見てください。 –

答えて

1

を私はRcppモジュール、または外部経由のいずれかを使用して、

#include <Rcpp.h> 
using namespace Rcpp; 

class myclass { 
private: 
    int k; 
public: 
    myclass(int n) : k(n){} 
    int getk() const {return k;} 
}; 

// [[Rcpp::export]] 
SEXP new_myclass(int n) { 
    XPtr<myclass> ptr(new myclass(n), true); 
    return ptr; 
} 

// [[Rcpp::export]] 
int getk(SEXP xpsexp){ 
    XPtr<myclass> xp(xpsexp); 
    return xp->getk(); 
} 
+0

うん、私の間違いに気づいた後でこれを正確に投稿するつもりだった(Dirkのpdfとのクロスリファレンスを参照)。ありがとうございました。 –

関連する問題