2017-12-08 27 views
1

저는 C++ 또는 Rcpp 전문가는 아니지만 R에서 C++ 데이터 멤버에 액세스 할 수 있다는 것은 어리석은 질문 일 경우 사과드립니다. 내 시도가 아래에 실패R ++에서 C++ 객체 데이터 멤버에 액세스

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

당신이 할 수있는 예, 사용 중 Rcpp 모듈, 또는 외부를 통해를 사용합니다 포인터 (귀하의 예제가 꽤 정확하지는 않지만) 또는 물론 getter 및 setter 함수를 사용하여 클래스의 인스턴스에 수동으로 R에서 똑딱 거리는 eed). –

+0

Rcpp 모듈을 살펴 보겠습니다. https://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-modules.pdf 문서에서 다루는 것처럼 보입니다. 고맙습니다. –

+0

예 Rcpp (및 해당 테스트)의 예제를 살펴보십시오. –

답변

1

나는

#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와 상호 참조함으로써) 고맙습니다. –