<div dir="ltr">Hi,<div><br></div><div>My question is how can I return a thread safe NA_REAL using RcppParallel? I've read many posts about how it's not thread safe to call R or Rcpp APIs when using RcppParallel (<a href="http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2016-January/009061.html" target="_blank">http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2016-January/009061.html</a>), so in the past I've played it safe by returning NAN in C++ instead (as it's my understanding NA_REAL is specific to R).</div><div><br></div><div>The following example is a modified version of "Transforming a Matrix in Parallel using RcppParallel" (<a href="http://gallery.rcpp.org/articles/parallel-matrix-transform/" target="_blank">http://gallery.rcpp.org/articles/parallel-matrix-transform/</a>) that checks whether the input value is NA before taking the sqrt, otherwise NA is returned (note: this is the desired behavior and for illustrative purposes only):</div><div><div><br></div><div><div><font face="monospace, monospace">// [[Rcpp::depends(RcppParallel)]]</font></div><div><font face="monospace, monospace">#include <Rcpp.h></font></div><div><font face="monospace, monospace">#include <RcppParallel.h></font></div><div><font face="monospace, monospace">using namespace Rcpp;</font></div><div><font face="monospace, monospace">using namespace RcppParallel;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">struct SquareRoot : public Worker</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">  // source vector</font></div><div><font face="monospace, monospace">  const RVector<double> input;</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">  // destination vector</font></div><div><font face="monospace, monospace">  RVector<double> output;</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">  // initialize with source and destination</font></div><div><font face="monospace, monospace">  SquareRoot(const NumericVector input, NumericVector output) </font></div><div><font face="monospace, monospace">    : input(input), output(output) {}</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">  // take the square root of the range of elements requested</font></div><div><font face="monospace, monospace">  void operator()(std::size_t begin, std::size_t end) {</font></div><div><font face="monospace, monospace">    for (std::size_t i = begin; i < end; i++) {</font></div><div><font face="monospace, monospace">      if (std::isnan(input[i])) {</font></div><div><font face="monospace, monospace">        output[i] = NA_REAL; // this is the desired output (instead of NAN)</font></div><div><font face="monospace, monospace">      } else {</font></div><div><font face="monospace, monospace">        output[i] = sqrt(input[i]);</font></div><div><font face="monospace, monospace">      }</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">  }</font></div><div><font face="monospace, monospace">};</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// [[Rcpp::export]]</font></div><div><font face="monospace, monospace">NumericVector parallelVectorSqrt(NumericVector x) {</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">  // allocate the output vector</font></div><div><font face="monospace, monospace">  NumericVector output(x.size());</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">  // SquareRoot functor (pass input and output vectors)</font></div><div><font face="monospace, monospace">  SquareRoot squareRoot(x, output);</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">  // call parallelFor to do the work</font></div><div><font face="monospace, monospace">  parallelFor(0, x.size(), squareRoot);</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">  // return the output vector</font></div><div><font face="monospace, monospace">  return output;</font></div><div><font face="monospace, monospace">  </font></div><div><font face="monospace, monospace">}</font></div></div><div><br></div><div>Any guidance or insight would be much appreciated. Thanks!<br></div><div><br></div><div><br></div><div><br></div><div><br></div></div></div>