0

この投稿では、 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 . しかし、1 つのエラーが"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);
  
}

4

1 に答える 1