在 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
>
我想将 -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
>