I dont know. This looks like a deeply hidden problem. 

Maybe you can enable some rcpp debugging by adding 

#define RCPP_DEBUG_LEVEL 1 

Before you include Rcpp.h, this will give you verbose output, maybe this will 
help locating the issue. 

Romain

Envoyé de mon iPhone

Le 14 déc. 2012 à 16:31, Honglang Wang <[email protected]> a écrit :

> Hi Romain,
> Thanks very much. I tried your method. And now the old error has gone, which 
> is really good for me. But a new error is :
> Error in betahat(ker, x, X, y, t, h, m) :
>   (list) object cannot be coerced to type 'double'
> Calls: system.time ... apply -> FUN -> betahat -> .External -> cpp_exception
> Execution halted
> 
> What should I do? Do I have to do like:
> arma::colvec betahat0(betahat.begin(),betahat.size()/2,false);
> NumericVector betahat00(p);
> betahat00 = betahat0;
> return List::create(Named("betahat") = betahat00);
> 
> Best wishes!
>  
> Honglang Wang
>  
> Office C402 Wells Hall
> Department of Statistics and Probability
> Michigan State University
> 1579 I Spartan Village, East Lansing, MI 48823
> [email protected]
> 
> 
> 
> On Fri, Dec 14, 2012 at 2:09 AM, Romain Francois <[email protected]> 
> wrote:
>> Le 14/12/12 03:15, Honglang Wang a écrit :
>>> Hi,
>>> Here is the sample code:
>>> // [[Rcpp::export]]
>>> List betahat(Function ker, double t0, NumericMatrix Xr, NumericMatrix
>>> yr, NumericVector tr, double h, int m) {
>>>    int n = Xr.nrow(), p = Xr.ncol();
>>>    arma::mat X(Xr.begin(), n, p, false);
>>>    arma::mat y(yr.begin(), n, 1, false);
>>>    arma::colvec t(tr.begin(), tr.size(), false);
>>>    arma::mat T = X;
>>>    T.each_col() %= (t-t0)/h;
>>>    arma::vec K =as<arma::vec>(ker(tr-t0,h))/
>>> m;
>>>    double L1 = arma::accu(K%X.col(0)%X.col(0));
>>>    double L2 = arma::accu(K%X.col(0)%X.col(1));
>>>    double L3 = arma::accu(K%X.col(1)%X.col(1));
>>>    double L4 = arma::accu(K%X.col(0)%T.col(0));
>>>    double L5 = arma::accu(K%X.col(1)%T.col(0));
>>>    double L6 = arma::accu(K%X.col(1)%T.col(1));
>>>    double L7 = arma::accu(K%T.col(0)%T.col(0));
>>>    double L8 = arma::accu(K%T.col(0)%T.col(1));
>>>    double L9 = arma::accu(K%T.col(1)%T.col(1));
>>>    double R1 = arma::accu(K%X.col(0)%y);
>>>    double R2 = arma::accu(K%X.col(1)%y);
>>>    double R3 = arma::accu(K%T.col(0)%y);
>>>    double R4 = arma::accu(K%T.col(1)%y);
>>>    arma::mat L(2*p,2*p);
>>>    L(0,0)=L1;L(0,1)=L2;L(0,2)=L4;L(0,3)=L5;
>>>    L(1,0)=L2;L(1,1)=L3;L(1,2)=L5;L(1,3)=L6;
>>>    L(2,0)=L4;L(2,1)=L5;L(2,2)=L7;L(2,3)=L8;
>>>    L(3,0)=L5;L(3,1)=L6;L(3,2)=L8;L(3,3)=L9;
>>>    arma::mat R(2*p,1);
>>>    R(0,0)=R1;R(1,0)=R2;R(2,0)=R3;R(3,0)=R4;
>>>    arma::vec betahat = arma::solve(L,R);
>>> 
>>>    arma::colvec betahat0(betahat.begin(),betahat.size()/2,false);
>>>    return List::create(Named("betahat") = betahat0);
>>> }
>>> 
>>> I will call this function repeatedly, and at some point, it went wrong
>>> with the following error:
>>> Error in betahat(ker, x, X, y, t, h, m) :
>>>    promise already under evaluation: recursive default argument
>>> reference or earlier problems?
>>> Calls: system.time ... apply -> FUN -> betahat -> .External -> cpp_exception
>>> Execution halted
>>> 
>>> I have no idea what's this error. I am just wondering whether I need to
>>> free some memory in this code. Thanks.
>> 
>> You don't. The explicit constructor/destructor scheme of C++ takes care of 
>> this automatically for you.
>> 
>> So there is a chance you are victim of a well hidden bug. These are usually 
>> related to garbage collection and us not making enough precaution somewhere. 
>> This is very hard to track.
>> 
>> As a wild guess, I think it is because Function return you an unprotected 
>> SEXP. It does not matter most of the time because you consume it, but 
>> sometimes the GC will run and collect your object before as<mat> has a 
>> chance to process it.
>> 
>> If my guess is correct, then doing yourself some protection might do the 
>> trick, something like:
>> 
>> NumericVector result = ker(tr-t0,h) ;
>> arma::vec K =as<arma::vec>(result)/m;
>> 
>> will do the trick since the result of the function call then gets protected 
>> by the "result" object.
>> 
>> If this does not work, then you can do some debugging as indicated by others.
>> 
>> Romain
>> 
>>> Best wishes!
>>> Honglang Wang
>>> Office C402 Wells Hall
>>> Department of Statistics and Probability
>>> Michigan State University
>>> 1579 I Spartan Village, East Lansing, MI 48823
>>> [email protected] <mailto:[email protected]>
>>> 
>>> 
>>> 
>>> 
>>> On Thu, Dec 13, 2012 at 4:57 PM, <[email protected]
>>> <mailto:[email protected]>> wrote:
>>> 
>>> 
>>>     Hello,
>>> 
>>>     What memory do you want to free ? Can you give an example of code
>>>     where there is memory you'd like to "free" ?
>>> 
>>>     Romain
>>> 
>>>     Le 2012-12-13 22:52, Honglang Wang a écrit :
>>> 
>>>         Dear All,
>>>         How to free memory in Rcpp? What's the command? Thanks.
>>> 
>>>         Best wishes!
>>> 
>>>         Honglang Wang
>>> 
>>>         Office C402 Wells Hall
>>>         Department of Statistics and Probability
>>>         Michigan State University
>>>         1579 I Spartan Village, East Lansing, MI 48823
>>>         [email protected] <mailto:[email protected]> [1]
>>> 
>>> 
>>>         Links:
>>>         ------
>>>         [1] mailto:[email protected] <mailto:[email protected]>
>> 
>> 
>> -- 
>> Romain Francois
>> Professional R Enthusiast
>> +33(0) 6 28 91 30 30
>> 
>> R Graph Gallery: http://gallery.r-enthusiasts.com
>> 
>> blog:            http://romainfrancois.blog.free.fr
>> |- http://bit.ly/RE6sYH : OOP with Rcpp modules
>> `- http://bit.ly/Thw7IK : Rcpp modules more flexible
> 
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to