<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>