Thanks, 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 wangh...@msu.edu On Fri, Dec 14, 2012 at 11:04 AM, Romain Francois <rom...@r-enthusiasts.com>wrote: > 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 <wanghonglang2...@gmail.com> 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 > wangh...@msu.edu > > > > On Fri, Dec 14, 2012 at 2:09 AM, Romain Francois <rom...@r-enthusiasts.com > > 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 >>> wangh...@msu.edu <mailto:wangh...@msu.edu> >>> >>> >>> >>> >>> On Thu, Dec 13, 2012 at 4:57 PM, <rom...@r-enthusiasts.com >>> <mailto:romain@r-enthusiasts.**com <rom...@r-enthusiasts.com>>> 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 >>> wangh...@msu.edu <mailto:wangh...@msu.edu> [1] >>> >>> >>> Links: >>> ------ >>> [1] mailto:wangh...@msu.edu <mailto:wangh...@msu.edu> >>> >> >> >> -- >> Romain Francois >> Professional R Enthusiast >> +33(0) 6 28 91 30 30 >> >> R Graph Gallery: >> http://gallery.r-enthusiasts.**com<http://gallery.r-enthusiasts.com> >> >> blog: >> http://romainfrancois.blog.**free.fr<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 Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel