在 Rcpp 中查找最小值时忽略缺失值

Ignore missing values while finding min in Rcpp

我试图从 Rcpp 中的 2 个向量中找到 2 个值中的最小值。但以下不编译:

#include <cmath>
#include <Rcpp.h>
using namespace Rcpp;



// [[Rcpp::export]]
NumericVector timesTwo(int time_length, double BXadd, 
                       NumericVector vn_complete, NumericVector vn1_complete) {
  
  // Empty vectors
  NumericVector BX (time_length);
  
  for(int t = 0; t < time_length; t++) {

    BX[t] = BXadd * sqrt(std::min(na_omit(vn_complete[t], vn1_complete[t])));
    
  }

  return BX;
  
  // return vn_complete[0];
}

  Error 1 occurred building shared library.

如果我不使用 na_omit,它会起作用。

运行 函数的 R 代码:

Rcpp::sourceCpp("test.cpp")

timesTwo(5, 2, 5:9, 1:5)

下面是一个有点荒谬的答案(因为它只适用于不包含 NA 的向量)但它具有您的代码所具有的所有组件,并且可以编译。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector foo(int time_length, double BXadd,
                  NumericVector vn_complete, NumericVector vn1_complete) {

    // Empty vectors
    NumericVector BX (time_length);
    vn_complete = na_omit(vn_complete);
    vn1_complete = na_omit(vn1_complete);
    for(int t = 0; t < time_length; t++) {
        double a = vn_complete[t];
        double b = vn1_complete[t];
        BX[t] = BXadd * std::sqrt(std::min(a,b));
    }
    return BX;
}

// Edited version with new function added 
// [[Rcpp::export]]
NumericVector foo2(double BXadd, NumericVector vn_complete, 
                   NumericVector vn1_complete) {
    return BXadd * sqrt(pmin(vn_complete, vn1_complete));
}

/*** R
foo(5, 2, 5:9, 1:5)
foo2(5, 2, 5:9, 1:5)
*/

对于真正的解决方案,您将不得不更深入地考虑去除 NA 应该做什么因为它也会改变向量的长度。所以这仍然需要工作。

最后,你的整个函数可以用 R 写成

2 * sqrt(pmin(5:9, 1:5))

而且我认为您也可以使用 Rcpp 糖来编写 相同的表达式,因为我们有 pmin()sqrt():

// [[Rcpp::export]]
NumericVector foo2(double BXadd, NumericVector vn_complete, 
                   NumericVector vn1_complete) {
    return BXadd * sqrt(pmin(vn_complete, vn1_complete));
}