调用"Rcpp::List"中的元素以供将来直接使用



在一个应用程序中,我使用List来包含一些变量(doublearma::mat和其他类型(,然后将该列表中的arma::mat组件直接用于其他用途,例如矩阵加法。但是,会抛出一些错误。

下面是一个玩具例子,抛出与我遇到的错误相同的错误:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
arma::mat f(){
arma::mat x = arma::randn(3, 4) ;
List y = List::create( ::Named("a") = arma::randn(3, 4) ) ;

return x - y["a"] ;
}

错误信息为

ambiguous overload for 'operator-' (operand types are 'arma::mat' 
{aka 'arma::Mat<double>'} and 'Rcpp::Vector<19>::NameProxy' {aka
'Rcpp::internal::generic_name_proxy<19, Rcpp::PreserveStorage>'})

有没有办法在数值计算中直接使用y["a"]

您需要从添加到(R或Rcpp,相同(List时创建的SEXP类型进行强制转换。纠正这一点并添加一个缺失的exports标记,我们将看到下面的内容,我还添加了示例调用(另一个不错的特性(。

代码

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
arma::mat f(){
arma::mat x = arma::randn(3, 4) ;
List y = List::create( ::Named("a") = arma::randn(3, 4) ) ;
return x - Rcpp::as<arma::mat>(y["a"]);
}
/*** R
set.seed(42) # reproducible RNG draws
f()
*/

输出

> Rcpp::sourceCpp("~/git/stackoverflow/71612260/answer.cpp")
> 
set.seed(42) # reproducible RNG draws
> 
f()
[,1]      [,2]      [,3]      [,4]
[1,] -0.471335 -2.337283  1.205825  0.537811
[2,]  0.119150  1.251941  0.486474 -0.513627
[3,]  3.309860 -0.654003 -0.146678 -0.835439
> 

最新更新