通过引用传递的 Rcpp 更新矩阵和 return R 中的更新

Rcpp Update matrix passed by reference and return the update in R

我检查了很多关于如何使用 Rcpp 通过引用传递的例子。例如,我看到 this 非常好。但是我有一个问题。假设我有一个矩阵作为 R 中的对象,我想将 1 添加到条目 [1,1]。如果矩阵在 Cpp 中,我看到的示例有效,但我想在不使用 return 语句的情况下 return R 中的更新。

这是我用列表做的一个例子,效果很好

//[[Rcpp::export]]
void test(List& a){
 a(0)=0;
}

我需要对矩阵做类似的事情。像 :

//[[Rcpp::export]]
 void test(arma::mat& a){
  a(0,0)=0;
 }

第二个不更新我在 R 中的矩阵,而是更新列表。

谁能帮帮我?

让我们首先重申这可能是一种不好的做法。不要使用 void、return 您更改的对象——这是一种更常见的方法。

也就是说,您可以使它以任何一种方式工作。对于 RcppArmadillo,通过(显式)引用传递。我得到了想要的行为

> sourceCpp("/tmp/so.cpp")

> M1 <- M2 <- matrix(0, 2, 2)

> bar(M1)

> M1
     [,1] [,2]
[1,]   42    0
[2,]    0    0

> foo(M2)

> M2
     [,1] [,2]
[1,]   42    0
[2,]    0    0
> 

出于这个简短的例子:

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
void bar(Rcpp::NumericMatrix M) {
  M(0,0) = 42;
}

// [[Rcpp::export]]
void foo(arma::mat M) {
  M(0,0) = 42;
}

/*** R
M1 <- M2 <- matrix(0, 2, 2)

bar(M1)
M1

foo(M2)
M2
*/