2015-01-12 4 views
3

저는 최근에 Rcpp 코딩을 많이 해왔고 저를 혼란스럽게하는 것을 발견했습니다. 필자는 주어진 함수가 호출 될 때 특정 매개 변수의 복사본을 생성 한 다음 함수가 완료되면 해당 변수가 파괴된다는 인상하에있었습니다. 그러나, 나는 때로는 나타나지 않는 List 유형으로 작업 할 때를 발견했습니다. 어떤 경우에는 다른 기능의 목록 요소를 수정해야하지만 '상위'범위의 목록을 변경하지 않고 유지해야 할 수도 있습니다. 여기서 문제 입증하는 매우 단순화 된 예이다Rcpp 매개 변수 범위가 전파됩니까?

Test.cpp에

//[[Rcpp::export]] 
int list_length(List myList){ 

    // some sort of modification that could be needed locally 
    for (int w=0; w < myList.size(); w++) { 
     myList[w] = 13; 
    } 

    // return whatever metric 
    return myList.size(); 
} 

//' @export 
//[[Rcpp::export]] 
SEXP list_int(List myList){ 

    // only want the int output from function 
    int out = list_length(myList); 

    return(List::create(myList, 
         wrap(out))); 
} 

test.R는

# create simple list 
myList <- as.list(seq(4)) 

# call Rcpp function 
list_int(myList) 

# output 
[[1]] 
[[1]][[1]] 
[1] 13 

[[1]][[2]] 
[1] 13 

[[1]][[3]] 
[1] 13 

[[1]][[4]] 
[1] 13 


[[2]] 
[1] 4 

시피 목록이 함수 위의 범위에서 수정 . 내가 여기서 뭔가를 놓치고 있니?

답변

2

예, SEXP가 포인터를 전달하지 못했습니다.

이것은 꽤 잘 문서화되었으며, 우리는 일반적으로 우리의 유형을 '얕은 프록시 객체'라고 부릅니다.

+0

감사합니다. Dirk, 친절하게도 그러한 문서를 안내해 주시겠습니까? 이 정보만으로는 크게 도움이되지 않습니다. 나는 여전히 함수 내에서 목록을 어떻게 수정하는지 알 수 없다. 죄송합니다. 간단하다면 C++ 프로그래밍에 익숙하지 않습니다. – cdeterman

+0

'Rcpp proxy object'용어 등을 언급하는 토론을 위해 깊은 복사를 강요하는'Rcpp :: clone()'에 대한 토론을 검색 할 수 있습니다.이 6 년 동안 메일 링리스트 전체에 걸쳐있었습니다. 마지막으로, [Rcpp에 대한 책] (http://www.rcpp.org/book/)이 있습니다. –

+0

Dirk에게 감사드립니다. 소스를 더 철저하게 탐구 할 것입니다. – cdeterman

관련 문제