C++ 如何将多个对象从Rcpp返回到R?

C++ 如何将多个对象从Rcpp返回到R?,c++,r,rcpp,C++,R,Rcpp,这可能是一个非常基本的请求,但我在R中有一个Rcpp函数,用于计算各种矩阵,我希望将这些矩阵传递回R。我的代码如下所示: zeromatrix <- matrix(0,6,1) east <- matrix(seq(1:48),6,8) west <- matrix(seq(1:48),6,8) func <- 'NumericMatrix eastC(NumericMatrix e, NumericMatrix w, NumericMatrix zeromatrix)

这可能是一个非常基本的请求,但我在R中有一个Rcpp函数,用于计算各种矩阵,我希望将这些矩阵传递回R。我的代码如下所示:

zeromatrix <- matrix(0,6,1)
east <- matrix(seq(1:48),6,8)
west <- matrix(seq(1:48),6,8)
func <- 'NumericMatrix eastC(NumericMatrix e, NumericMatrix w, NumericMatrix zeromatrix) {
int ecoln=e.ncol();
int ecolnlessone = ecoln - 1;
NumericMatrix eout(e.nrow(),e.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j > 0) {
eout(_,j) = e(_,j-1);
} else {
eout(_,j) = e(_,0);
}
}
eout(_,0) = zeromatrix(_,0);
return eout;

NumericMatrix wout(w.nrow(),w.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j < ecolnlessone) {
wout(_,j) = w(_,j+1);
} else {
wout(_,j) = w(_,j);
}
}
wout(_,ecolnlessone) = zeromatrix(_,0);
return wout;
}'
cppFunction(func)

d <- eastC(east, west, zeromatrix)

zeromatrix删除
return
语句并添加:

List ret;
ret["eout"] = eout;
ret["wout"] = wout;
return ret;`
并将
eastC
的返回类型更改为
List

因此,结果应该是:

zeromatrix <- matrix(0,6,1)
east <- matrix(seq(1:48),6,8)
west <- matrix(seq(1:48),6,8)
func <- 'List eastC(NumericMatrix e, NumericMatrix w, NumericMatrix zeromatrix) {
int ecoln=e.ncol();
int ecolnlessone = ecoln - 1;
NumericMatrix eout(e.nrow(),e.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j > 0) {
eout(_,j) = e(_,j-1);
} else {
eout(_,j) = e(_,0);
}
}
eout(_,0) = zeromatrix(_,0);

NumericMatrix wout(w.nrow(),w.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j < ecolnlessone) {
wout(_,j) = w(_,j+1);
} else {
wout(_,j) = w(_,j);
}
}
wout(_,ecolnlessone) = zeromatrix(_,0);
List ret;
ret["eout"] = eout;
ret["wout"] = wout;
return ret;
}'
cppFunction(func)

d <- eastC(east, west, zeromatrix)

zeromatrix删除
return
语句并添加:

List ret;
ret["eout"] = eout;
ret["wout"] = wout;
return ret;`
并将
eastC
的返回类型更改为
List

因此,结果应该是:

zeromatrix <- matrix(0,6,1)
east <- matrix(seq(1:48),6,8)
west <- matrix(seq(1:48),6,8)
func <- 'List eastC(NumericMatrix e, NumericMatrix w, NumericMatrix zeromatrix) {
int ecoln=e.ncol();
int ecolnlessone = ecoln - 1;
NumericMatrix eout(e.nrow(),e.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j > 0) {
eout(_,j) = e(_,j-1);
} else {
eout(_,j) = e(_,0);
}
}
eout(_,0) = zeromatrix(_,0);

NumericMatrix wout(w.nrow(),w.ncol()) ;
for (int j = 0;j < ecoln;j++) {
if (j < ecolnlessone) {
wout(_,j) = w(_,j+1);
} else {
wout(_,j) = w(_,j);
}
}
wout(_,ecolnlessone) = zeromatrix(_,0);
List ret;
ret["eout"] = eout;
ret["wout"] = wout;
return ret;
}'
cppFunction(func)

d <- eastC(east, west, zeromatrix)

zeromatrix查看我刚才链接的问题,您需要
Rcpp::List::create()
并在该调用中分配您的对象。谢谢。但是我尝试在其中使用::的任何东西(比如Rcpp::List::create())都会失败。我使用的是革命性的R。我很想让armadillo包工作,但尽管加载了库,但您的示例都不起作用。我不确定这是否是因为我没有正确安装RTools。我需要犰狳提供的代数工具。下面的答案似乎回答了我的问题。谢谢。请看我刚才链接的问题,您需要
Rcpp::List::create()
并在该调用中分配您的对象。谢谢。但是我尝试在其中使用::的任何东西(比如Rcpp::List::create())都会失败。我使用的是革命性的R。我很想让armadillo包工作,但尽管加载了库,但您的示例都不起作用。我不确定这是否是因为我没有正确安装RTools。我需要犰狳提供的代数工具。下面的答案似乎回答了我的问题。谢谢。是的,很好用。我想我可以通过使用d$eout引用我需要的特定矩阵。您需要List::create以提高效率。是的,可以。我想我可以通过使用d$eout引用我需要的特定矩阵。