在这篇文章中,我定义了一个名为soft的函数。当我使用sourceCpp编译它时,报告的错误是
- ZH 未在此范围内声明
- alpha0H 未在此范围内声明
- maxRankH 未在此范围内声明
我尝试了很多方法来解决“......未在此范围内声明”的问题。但是,我没有找到正确的方法或错误发生的原因。我猜它应该与函数中的if-else语句有关,但不确定。
你有什么好主意来解决这个问题吗?先感谢您!
顺便说一句,我之前没有在参数中写Rcpp::NullableRcpp::LogicalMatrix Ome_ = R_NilValue, Rcpp::NullableRcpp::LogicalMatrix Ome1_ = R_NilValue, Rcpp::NullableRcpp::LogicalMatrix Ome2_ = R_NilValue,而是Rcpp:: LogicalMatrix Ome,Rcpp::LogicalMatrix Ome1,Rcpp::LogicalMatrix Ome2。但是报告了一个错误"default missing for ...arguments...",所以我改为Rcpp::NullableRcpp::LogicalMatrix ....
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
Rcpp::List dcSVD(arma::mat X) {
arma::mat u, v;
arma::vec d;
arma::svd(u, d, v, X, "dc");
return Rcpp::List::create(Rcpp::Named("u") = u,
Rcpp::Named("d") = d,
Rcpp::Named("v") = v);
}
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
Rcpp::List soft(arma::mat X, Rcpp::Nullable<Rcpp::NumericMatrix> Z_ = R_NilValue, Rcpp::Nullable<Rcpp::LogicalMatrix> Ome_ = R_NilValue, Rcpp::Nullable<Rcpp::LogicalMatrix> Ome1_ = R_NilValue, Rcpp::Nullable<Rcpp::LogicalMatrix> Ome2_ = R_NilValue, Rcpp::Nullable<Rcpp::NumericVector> alpha0_ = R_NilValue, Rcpp::Nullable<Rcpp::NumericVector> maxRank_ = R_NilValue){
if (Ome_.isNotNull() && Ome1_.isNotNull() && Ome2_.isNotNull()){
Rcpp::LogicalMatrix Ome(Ome_);
arma::umat Omega = Rcpp::as<arma::umat>(Ome);
Rcpp::LogicalMatrix Ome1(Ome1_);
arma::umat Omega1 = Rcpp::as<arma::umat>(Ome1);
Rcpp::LogicalMatrix Ome2(Ome2_);
arma::umat Omega2 = Rcpp::as<arma::umat>(Ome2);
arma::mat X_0 = X % Omega;
if (!Z_.isNotNull()){
Rcpp::NumericMatrix ZH = Rcpp::wrap(X_0);
}else{
Rcpp::NumericMatrix ZH = Rcpp::as<Rcpp::NumericMatrix>(Z_);
}
if (!alpha0_.isNotNull()){
Rcpp::List my_svd = dcSVD(X_0);
arma::vec d = my_svd["d"];
Rcpp::NumericVector alpha0H = d(1);
}else{
Rcpp::NumericVector alpha0H = Rcpp::as<Rcpp::NumericVector>(alpha0_);
}
if (!maxRank_.isNotNull()){
Rcpp::NumericVector maxRankH = -1;
}else{
Rcpp::NumericVector maxRankH = Rcpp::as<Rcpp::NumericVector>(maxRank_);
}
}else{
Rcpp::StringVector ZH = "NULL";
Rcpp::StringVector alpha0H = "NULL";
Rcpp::StringVector maxRankH = "NULL";
}
return Rcpp::List::create(Rcpp::Named("ZH") = ZH,
Rcpp::Named("alpha0H") = alpha0H,
Rcpp::Named("maxRankH") = maxRankH);
}