我查看了很多关于如何使用Rcpp传递引用的示例。我看到例如this非常棒。但是我有一个问题。假设我有一个矩阵作为R中的对象,我想在条目[1,1]中加1。我看到的例子是矩阵在Cpp中,但我想在不使用return语句的情况下返回R中的更新。
这是我用列表做的一个例子,它运作良好
//[[Rcpp::export]]
void test(List& a){
a(0)=0;
}
我需要用矩阵做类似的事情。类似的东西:
//[[Rcpp::export]]
void test(arma::mat& a){
a(0,0)=0;
}
第二个不更新R中的矩阵但更新列表。
任何人都可以帮助我吗?
答案 0 :(得分:2)
让我们首先重申这可能是不好的做法。不要使用void
,返回更改后的对象 - 这是一种更常见的方法。
那就是说,你可以让它以任何一种方式运作。对于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
*/