直接调用 `Rcpp::List` 中的元素进一步使用

Invoke the element in `Rcpp::List` for futher use directly

在一个应用程序中,我使用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 类型回退。更正它并添加一个丢失的导出标签给了我们下面我还添加了示例调用的地方(另一个不错的功能)。

代码

// [[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/Whosebug/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
>