<div dir="ltr"><div><p style="margin:0px 0px 1.1em;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;line-height:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;clear:both"><span style="color:rgb(12,13,14);font-family:-apple-system,"system-ui","Segoe UI Adjusted","Segoe UI","Liberation Sans",sans-serif;font-size:15px">Hello Rcpp developers,</span></p><p style="margin:0px 0px 1.1em;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;line-height:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;clear:both"><span style="color:rgb(12,13,14);font-family:-apple-system,"system-ui","Segoe UI Adjusted","Segoe UI","Liberation Sans",sans-serif;font-size:15px">The following R/Rcpp code attempts to take in a data frame, a model formula (passed as string), and uses Rcpp::Function to call R's model matrix function to create model matrices B times in parallel. Each time a model matrix is created, it is formed after permuting a given column in the data frame. </span></p><p style="margin:0px 0px 1.1em;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;line-height:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;clear:both"><span style="color:rgb(12,13,14);font-family:-apple-system,"system-ui","Segoe UI Adjusted","Segoe UI","Liberation Sans",sans-serif;font-size:15px">To avoid multi-threaded access to R, I had used the "locking" idea from the Boost example from RInside to use a scoped lock on a mutex, and use a single set of </span><span style="color:rgb(12,13,14);font-family:-apple-system,"system-ui","Segoe UI Adjusted","Segoe UI","Liberation Sans",sans-serif;font-size:15px">Rcpp::Function </span><span style="color:rgb(12,13,14);font-family:-apple-system,"system-ui","Segoe UI Adjusted","Segoe UI","Liberation Sans",sans-serif;font-size:15px">reference variables initialized ones. Unfortunately, the code compiles fine, but when I run the code, I get a : </span></p><p style="margin:0px 0px 1.1em;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;line-height:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;clear:both"><font color="#0c0d0e" face="-apple-system, system-ui, Segoe UI Adjusted, Segoe UI, Liberation Sans, sans-serif"><span style="font-size:15px">Error: C stack usage close to the limit. </span></font></p><p style="margin:0px 0px 1.1em;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;line-height:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;font-size:15px;vertical-align:baseline;box-sizing:inherit;clear:both;color:rgb(12,13,14)"><font face="arial, sans-serif">I would greatly appreciate any advice ! </font></p><p style="margin:0px 0px 1.1em;padding:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;line-height:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;font-size:15px;vertical-align:baseline;box-sizing:inherit;clear:both;color:rgb(12,13,14)"><font face="arial, sans-serif">Thank you, SK.</font></p></div><div><br></div><div>#### ---- C++ CODE ---------------########</div><div><br></div><div>/<font face="monospace">/ [[Rcpp::depends(RcppParallel)]]<br>// [[Rcpp::depends(RcppArmadillo)]]<br>#include <RcppArmadillo.h><br>#include <RcppParallel.h><br>#include <tbb/tbb.h><br><br>using namespace arma;<br>using namespace Rcpp;<br>using namespace RcppParallel;<br>typedef tbb::spin_mutex FreeListMutexType;<br><br>class testParallelCallingR : public Worker {<br>private:<br> Rcpp::String col2perm; <br> Rcpp::String formulaStr;<br> Rcpp::DataFrame& df0;<br> arma::vec& results;<br><br></font></div><div><font face="monospace"> Rcpp::Environment& stats, base;<br> Rcpp::Function& formula, modelMatrix, subset ;<br> SEXP& formulaObj;<br><br> FreeListMutexType FreeListMutex;<br><br>public:<br> explicit testParallelCallingR( Rcpp::String col2perm1,</font></div><div><font face="monospace"> Rcpp::String formulaStr1, </font></div><div><font face="monospace"> Rcpp::DataFrame& df0, arma::vec& res,<br> Rcpp::Environment& stats, Rcpp::Environment& base,<br> Rcpp::Function& formula, Rcpp::Function& modelMatrix, Rcpp::Function& subset, SEXP& formulaObj<br> ): df0(df0), results(res), stats(stats), base(base),<br> formula(formula), modelMatrix(modelMatrix), subset(subset), formulaObj(formulaObj) {<br> col2perm=col2perm1;<br> formulaStr=formulaStr1;<br> }<br><br> arma::mat getModelMat(){<br><br> //lock<br> FreeListMutexType::scoped_lock lock(FreeListMutex);<br><br></font></div><div><font face="monospace"> //permute the column col2perm </font></div><div><font face="monospace"> std::string timestr(col2perm);<br> Rcpp::DataFrame dfw = Rcpp::clone(df0);<br> Rcpp::NumericVector timevals = df0[timestr]; std::random_shuffle( timevals.begin(), timevals.end() );<br> dfw[timestr]=timevals;<br><br> //construct model mat with the dataframe with the permuted column<br> SEXP modelMatw=modelMatrix( formulaObj, dfw );<br> arma::mat Z = Rcpp::as<arma::mat>( modelMatw );<br> return Z;<br><br> }<br><br><br> void operator()( std::size_t begin, std::size_t end ) {<br> for( std::size_t j=begin; j < end; j++ ){<br> arma::mat Z=getModelMat();<br> results(j)=Z(0,0); //just as an example result, store the first index say<br> }<br> }<br>};<br><br><br>// [[Rcpp::export]]<br>arma::vec permDf( int B, Rcpp::String col2perm, Rcpp::String formulaStr, Rcpp::DataFrame df0 ){ <br><br> Rcpp::Environment stats("package:stats");<br> Rcpp::Environment base("package:base");<br> Rcpp::Function formula = stats["formula"];<br> Rcpp::Function modelMatrix=stats["model.matrix"];<br> Rcpp::Function subset("[.data.frame"); <br> SEXP formulaObj = formula(formulaStr);<br> arma::vec results( B, arma::fill::zeros );<br> testParallelCallingR tpc( col2perm, formulaStr, df0, results,<br> stats, base,<br> formula, modelMatrix, subset,<br> formulaObj<br> );<br> parallelFor( 0, B, tpc);<br> return results;<br>}</font><br></div><div><pre style="margin-top:0px;margin-bottom:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;color:rgb(12,13,14)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit">
# -- Call function from R side --</code></pre><pre style="margin-top:0px;margin-bottom:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;color:rgb(12,13,14)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit"># Create B permutatations of the column Sepal.Width, and form model matrice</code></pre><pre style="margin-top:0px;margin-bottom:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;color:rgb(12,13,14)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit">permDf( B=10, </code></pre><pre style="margin-top:0px;margin-bottom:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;color:rgb(12,13,14)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit"> col2perm = "Sepal.Width", </code></pre><pre style="margin-top:0px;margin-bottom:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;color:rgb(12,13,14)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit"> formulaStr = "~Sepal.Width + Sepal.Length", </code></pre><pre style="margin-top:0px;margin-bottom:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;color:rgb(12,13,14)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit"> df0=iris</code></pre><pre style="margin-top:0px;margin-bottom:0px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-variant-alternates:inherit;font-stretch:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;color:rgb(12,13,14)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit"> )
# -- Output --</code><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-size-adjust:inherit;font-kerning:inherit;font-feature-settings:inherit;vertical-align:baseline;box-sizing:inherit;background-color:transparent;white-space:inherit">
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587445176704 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587449383296 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587419937152 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587432556928 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587436763520 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587440970112 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587428350336 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587424143744 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Error: C stack usage<span class="gmail-Apple-converted-space"> </span>17587453589888 is too close to the limit</p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;line-height:normal">Execution halted</p><font face="inherit">
</font></code></pre></div></div>