Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Rcpp(犰狳)函数中使用数字序列作为默认值_C++_R_Rcpp_Rcpparmadillo - Fatal编程技术网

C++ 在Rcpp(犰狳)函数中使用数字序列作为默认值

C++ 在Rcpp(犰狳)函数中使用数字序列作为默认值,c++,r,rcpp,rcpparmadillo,C++,R,Rcpp,Rcpparmadillo,我需要一个更大的项目,但我认为这个最小的reprex解释它最好。我在R中具有以下功能: test <- function(x = 2^(1:9)) { x } test() #> [1] 2 4 8 16 32 64 128 256 512 test[1]24 8 16 32 64 128 256 512 这很好用。然而,我想使用Rcpp犰狳将其转换为Rcpp。我使用以下test.cpp文件进行了尝试: // [[Rcpp::depends(RcppAr

我需要一个更大的项目,但我认为这个最小的reprex解释它最好。我在R中具有以下功能:

test <- function(x = 2^(1:9)) {
    x
}
test()
#> [1]   2   4   8  16  32  64 128 256 512
test[1]24 8 16 32 64 128 256 512
这很好用。然而,我想使用Rcpp犰狳将其转换为Rcpp。我使用以下test.cpp文件进行了尝试:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace arma;

// [[Rcpp::export]]
vec test(const vec &lambda = arma::exp2(arma::linspace(1, 9, 9)))
{
    return lambda;
}
/[[Rcpp::depends(RcppArmadillo)]]
#包括
使用arma;
//[[Rcpp::导出]]
向量测试(const-vec&lambda=arma::exp2(arma::linspace(1,9,9)))
{
返回lambda;
}
但是使用
Rcpp::sourceCpp(“functions/test.cpp”)
编译此文件会产生警告:

<>警告消息:无法解析C++默认值 函数的参数lambda的'arma::exp2(arma::linspace(1,9,9))' 试验

默认参数不起作用(调用
test()

非常感谢。

您不能“根据我们这里的合同”这样做,因为通过导出签名使其成为R可以看到和调用的东西,它必须符合R API中
.call()
的签名,这是一个C函数,其中每个参数都是
SEXP

界面上没有C++表达式。你可以把这种逻辑作为第二个最好的选择

修改代码
我想补充一个解决方案,除了德克斯的答案。这是CPP代码

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace arma;

// [[Rcpp::export]]
vec test_cpp(Rcpp::NumericVector x = Rcpp::NumericVector::create())
{
    if (x.size() == 0)
    {
        x = exp2(linspace(1, 9, 9));
    }
    return x;
}
/[[Rcpp::depends(RcppArmadillo)]]
#包括
使用arma;
//[[Rcpp::导出]]
向量测试(Rcpp::NumericVector x=Rcpp::NumericVector::create())
{
如果(x.size()==0)
{
x=exp2(linspace(1,9,9));
}
返回x;
}
其思想是在默认情况下将x初始化为空数值向量。在函数内部,检查x是否为空,如果为空,其值将被所需的默认值覆盖

> Rcpp::sourceCpp("~/git/stackoverflow/65357225/answer.cpp")

> testCpp(1,9, 9)
      [,1]
 [1,]    2
 [2,]    4
 [3,]    8
 [4,]   16
 [5,]   32
 [6,]   64
 [7,]  128
 [8,]  256
 [9,]  512
> 
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace arma;

// [[Rcpp::export]]
vec test_cpp(Rcpp::NumericVector x = Rcpp::NumericVector::create())
{
    if (x.size() == 0)
    {
        x = exp2(linspace(1, 9, 9));
    }
    return x;
}