c++ - 在 Rcpp (Armadillo) 函数中使用数字序列作为默认参数
问题描述
我需要这个用于更大的项目,但我认为这个最小的代表最好地解释了它。我在 R 中有以下功能:
test <- function(x = 2^(1:9)) {
x
}
test()
#> [1] 2 4 8 16 32 64 128 256 512
这工作正常。但是,我想使用 Rcpp Armadillo 将其翻译成 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::sourceCpp("functions/test.cpp")
会产生一个警告:
警告消息:无法解析函数测试的参数 lambda 的 C++ 默认值 'arma::exp2(arma::linspace(1, 9, 9))'
并且默认参数不起作用(调用test()
)。
提前非常感谢。
解决方案
您不能“根据我们在这里的合同”这样做,因为通过导出签名以使其成为 R 可以看到并可以调用的东西,它必须符合.Call()
R API 中的 a 签名,这是一个 C 函数,其中每个参数都是一个SEXP
。
因此接口上不允许使用 C++ 表达式。您可以将该逻辑移入内部,作为次佳选择。
修改后的代码
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec testCpp(const int s, const int e, const int n) {
arma::vec lambda = arma::exp2(arma::linspace(s, e, n));
return lambda;
}
/*** R
testCpp(1,9, 9)
*/
输出
> 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
>
推荐阅读
- python - Python AWS dynamoDB:如何在非主列上使用过滤器查询元素?
- vue.js - 更新后数据未按正确顺序显示
- c - ARM32写保护位
- javascript - IntegrationError:paymentRequest() 的值无效:total.amount 应该是货币子单位中的正数。您指定:220.00000003
- python - 以自动方式创建具有某种形式的字符串的列表
- javascript - flexdashboard 行的图表部分中的选项卡
- regex - 正则表达式匹配和删除空格
- android - android.os.Build 从哪里获取它的值?(真的是 /system/build.prop 吗?)
- amazon-web-services - AWS MSK - Kafka 代理添加到 AWS 公共 DNS
- javascript - 当执行在同一`with`语句中声明的函数时,在`with`语句中声明的“找不到变量”