R 错误“***”未在此范围内声明;

R 错误“***”未在此范围内声明;,r,rcpp,rcpparmadillo,R,Rcpp,Rcpparmadillo,在这篇文章中,我定义了一个名为soft的函数。当我使用sourceCpp编译它时,报告的错误是 ZH未在此范围内声明 alpha0H未在此作用域中声明 maxRankH未在此范围内声明 我尝试了许多方法来解决这个问题,“…未在此范围内声明”。但是,我没有找到正确的方法,也没有找到发生错误的原因。我想它应该与函数中的if-else语句相关,但不确定 你有什么好主意来解决这个问题吗?提前谢谢你 顺便说一下,我没有在前面的参数中编写Rcpp::NullableRcpp::LogicalMatrix

在这篇文章中,我定义了一个名为soft的函数。当我使用sourceCpp编译它时,报告的错误是

  • ZH未在此范围内声明
  • alpha0H未在此作用域中声明
  • maxRankH未在此范围内声明
我尝试了许多方法来解决这个问题,“…未在此范围内声明”。但是,我没有找到正确的方法,也没有找到发生错误的原因。我想它应该与函数中的if-else语句相关,但不确定

你有什么好主意来解决这个问题吗?提前谢谢你

顺便说一下,我没有在前面的参数中编写Rcpp::NullableRcpp::LogicalMatrix Ome=R\u NilValue,Rcpp::NullableRcpp::LogicalMatrix Ome1=R\u NilValue,Rcpp::NullableRcpp::LogicalMatrix Ome2=R\u NilValue,而是Rcpp::LogicalMatrix Ome,Rcpp::LogicalMatrix Ome1,Rcpp::LogicalMatrix Ome2。但是有一个错误被报告为“默认缺少…参数…”,因此我改为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);
  
}

#包括
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
Rcpp::列表dcSVD(arma::mat X){
arma:matu,v;
arma::vecd;
arma::svd(u,d,v,X,“dc”);
返回Rcpp::List::create(Rcpp::Named(“u”)=u,
Rcpp::命名的(“d”)=d,
Rcpp::命名(“v”)=v);
}
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
Rcpp::List soft(arma::mat X,Rcpp::Nullable Z_=R_NilValue,Rcpp::Nullable Ome_=R_NilValue,Rcpp::Nullable Ome1_=R_NilValue,Rcpp::Nullable Ome2_=R_NilValue,Rcpp::Nullable alpha0_=R_NilValue,Rcpp::Nullable maxRank_=R_NilValue){
如果(Ome_u0.isNotNull()&&Ome1_0.isNotNull()&&Ome2_0.isNotNull()){
Rcpp::LogicalMatrix Ome(Ome_3;);
arma::umatω=Rcpp::as(ω);
Rcpp::LogicalMatrix Ome1(Ome1_);
arma::umat Omega1=Rcpp::as(Ome1);
Rcpp::LogicalMatrix Ome2(Ome2_);
arma::umat Omega2=Rcpp::as(Ome2);
arma::mat X_0=X%ω;
如果(!Z_u.isNotNull()){
Rcpp::numerimatrix ZH=Rcpp::wrap(X_0);
}否则{
Rcpp::numerimatrix ZH=Rcpp::as(Z_);
}
如果(!alpha0.isNotNull()){
Rcpp::List my_svd=dcSVD(X_0);
arma::vec d=my_svd[“d”];
Rcpp::数值向量alpha0H=d(1);
}否则{
Rcpp::NumericVector alpha0H=Rcpp::as(alpha0_2;);
}
如果(!maxRank_ux.isNotNull()){
Rcpp::NumericVector maxRankH=-1;
}否则{
Rcpp::NumericVector maxRankH=Rcpp::as(maxRank_);
}
}否则{
Rcpp::StringVector ZH=“NULL”;
Rcpp::StringVector alpha0H=“NULL”;
Rcpp::StringVector maxRankH=“NULL”;
}  
返回Rcpp::List::create(Rcpp::Named(“ZH”)=ZH,
Rcpp::Named(“alpha0H”)=alpha0H,
Rcpp::Named(“maxRankH”)=maxRankH);
}

C++的作用域规则使其在代码范围内声明的变量> {} /Cord>在该范围之外不可见。考虑将缺省定义移到一个级别,然后具有单独的<代码>如果范围覆盖这些缺省值:

Rcpp::List soft(...) {

    // Declare variables outside all {}
    //   to make them visible throughout the whole function
    Rcpp::NumericMatrix ZH = R_NilValue;

    // Overwrite the default values inside individual {}
    if (!Z_.isNotNull()){
      ZH = Rcpp::wrap(X_0);
    }else{
      ZH = Rcpp::as<Rcpp::NumericMatrix>(Z_);
    }

    // etc....
}
Rcpp::List soft(…){
//在所有{}之外声明变量
//使其在整个功能中可见
Rcpp::numerimatrix ZH=R_NilValue;
//覆盖单个{}内的默认值
如果(!Z_u.isNotNull()){
ZH=Rcpp::wrap(X_0);
}否则{
ZH=Rcpp::as(Z_);
}
//等等。。。。
}

c++遵循与R不同的作用域规则。特别是,
ZH
在声明的
{}
之外不可见,就像在R中一样。您可能希望将
NULL
声明向上移动一级,然后让单独的
if
语句覆盖
NULL
默认值。@ArtemSokolov谢谢!这很有效。您能解释我经常遇到的另一个错误“静态断言失败:错误:类型不匹配或不支持的类型”吗?再次感谢你!我认为范围界定在R中也不起作用。一般来说,我在任何条件之外的开头声明变量,通常使用一个正常的(且可区分的)默认值,因此如果我的
语句没有覆盖它,它们将被定义并具有一些有意义的内容(例如,某种形式的
NA
NULL
)。@r2evans Try
rm(y);if(TRUE){y好的,我想的更多的是
函数
局部
,我没有在我的原始语句中考虑
if
for
循环。从这个意义上说,…R是一个更宽容的,但它不是全局的。唉