在 Rcpp 中使用 Rcpp::NumericVector::create(R_NegInf) 作为函数参数

Use Rcpp::NumericVector::create(R_NegInf) as function argument in Rcpp

我想将 -Inf 设置为 Rcpp 中函数参数的默认值。我尝试了以下在执行时抛出错误的方法:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::NumericVector test_cpp1(
    Rcpp::NumericVector x = Rcpp::NumericVector::create(R_NegInf))
{
    return x;
}

[R] test_cpp1()                     
Error in test_cpp1() : object 'R_NegInf' not found

可能的解决方法是造成溢出:

// [[Rcpp::export]]
Rcpp::NumericVector test_cpp2(
    Rcpp::NumericVector x = Rcpp::NumericVector::create(-1E+999))
{
    return x;
}

[R] test_cpp2()                                
[1] -Inf

这有效但会导致编译警告。 有没有这个 hack 的解决方法? 非常感谢您。

编辑:

另一个例子来说明。这工作得很好:

// [[Rcpp::export]]
NumericVector test_cpp3(
    NumericVector x = NumericVector::create(1, 2, 3))
{
    return x;
}

但这不是:

// [[Rcpp::export]]
NumericVector test_cpp4(
    NumericVector x = NumericVector::create(R_NegInf, 2, 3))
{
    return x;
}

它在执行时抛出以下错误:

[R] test_cpp4()                                                                                                                                       
Error in test_cpp4() : object 'R_NegInf' not found

我希望它 return -Inf。我需要在 Rcpp 函数中使用这个 Vector x 来进行一些计算。它应该默认包含 -Inf。但是用户应该能够传递 he/she 想要的任何数字向量。

我想你选错了签名。根据您的后续评论,也许这就是您所追求的:size 的一个 int 参数,要分配的默认值的第二个 double 参数?

> cppFunction("NumericVector myvec(int n, double v) { \
                  return NumericVector(n, v); }")
> myvec(3, 1.23)
[1] 1.23 1.23 1.23
> 

适用于所有双精度值:

> makevec(3, -Inf)
[1] -Inf -Inf -Inf
> 

如果值是常数,也有几种方法可以做到这一点。这是一个:

> cppFunction("NumericVector makevec2(int n) { \
      double val = -std::numeric_limits<double>::infinity(); \
      return NumericVector(n, val); }")
> makevec2(3)
[1] -Inf -Inf -Inf
> 

编辑:你的编辑让你的问题更清楚了,你仍然在 R 不是 C++ 的问题上碰壁:类型很重要! !虽然 NumericVector::create(1, 2, 3) 可以 使用这些 integer 类型的值,但您只需 cannot 简单地在其中插入一个 double 并希望最好。 (尽管这可能与此处使用的 #define 的性质有关。)

编辑 2: 可能错误与 C 级有关 #define。我们也可以将单个 double,包括 -Inf 粘贴到 create() 中:

> cppFunction("NumericVector makevec3() { \  
      double val = -std::numeric_limits<double>::infinity();\
      return NumericVector::create(val); }")
> makevec3()
[1] -Inf
>