Error using Rcpp::Nullable with RcppArmadillo types

自古美人都是妖i 提交于 2019-11-28 06:24:14

问题


I'm using RcppArmadillo in my R package and I would like to use the Rcpp::Nullable in the parameter list.

NumericVector d_snb(NumericVector& x,
                Nullable<arma::mat> size_param = R_NilValue,
                const int& infinite = 100000, const bool& log_v = false)

This gives an error like:

Error: package or namespace load failed for ‘packagex’ in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '/usr/local/lib/R/3.4/site-library/packagex/libs/packagex.so': dlopen(/usr/local/lib/R/3.4/site-library/packagex/libs/packagex.so, 6): 
Symbol not found: __Z5d_snbRN4Rcpp6VectorILi14ENS_15PreserveStorageEEENS_8NullableIS2_EES5_S5_RKiRKb
Referenced from: /usr/local/lib/R/3.4/site-library/packagex/libs/packagex.so
Expected in: flat namespace in /usr/local/lib/R/3.4/site-library/packagex/libs/packagex.so
Error: loading failed
Execution halted

The only possible solution right now seems to get the parameter as NumericVector and then get contents and then cast it into Armadillo types.

NumericVector d_snb(NumericVector& x,
                Nullable<NumericVector> size_param = R_NilValue ...)
{
...

  if(size_param.isNotNull()) {
    arma::mat test(NumericVector(size_param));
    param_check++;
  }
...
}

This gives a warning:

d_snb.cpp:36:21: warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]
  arma::mat test(NumericVector(size_param));
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~
d_snb.cpp:36:22: note: add a pair of parentheses to declare a variable
  arma::mat test(NumericVector(size_param));
                 ^
                 (                        )
1 warning generated.

What's the best way to go about this ?


回答1:


Yes, Rcpp::Nullable<> works only around SEXP-based Rcpp types.

So you have to do the two-step procedure you found. But I think you can do one simpler: arma::mat test = Rcpp::as<arma::mat>(size_param);

Here is a complete example which compiles (but does 'nothing'):

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
void d_snb(Rcpp::NumericVector& x,
           Rcpp::Nullable<Rcpp::NumericVector> size_param = R_NilValue) {

  if (size_param.isNotNull()) {
    arma::vec test = Rcpp::as<arma::vec>(size_param);
    test.print("vector");
  }
  Rcpp::Rcout << x << std::endl;

}

And a quick demo:

R> sourceCpp("/tmp/so44102346.cpp")
R> d_snb(c(1,2,3))
1 2 3
R> d_snb(c(1,2,3), c(4,5,6))
vector
   4.0000
   5.0000
   6.0000
1 2 3
R> 


来源:https://stackoverflow.com/questions/44231046/error-using-rcppnullable-with-rcpparmadillo-types

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!