如何将 return 多个对象从 Rcpp 返回到 R?
How to return multiple objects from Rcpp back to R?
这可能是一个非常基本的要求,但我在 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)
我希望 'eout' 和 'wout' 都传回 R 但显然只有最后返回的值被传回(即 wout)。所以d变成了wout。如何提取多个对象(即本例中的 eout 和 wout)?我确实在 Dirk 的 Rcpp 介绍表中看到了一些关于 list(ret) 的内容,但是当我尝试这个时,我的代码无法编译。任何帮助将不胜感激?
如何删除两个 return
语句并添加:
List ret;
ret["eout"] = eout;
ret["wout"] = wout;
return ret;`
并将 eastC
的 return 类型更改为 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)
这可能是一个非常基本的要求,但我在 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)
我希望 'eout' 和 'wout' 都传回 R 但显然只有最后返回的值被传回(即 wout)。所以d变成了wout。如何提取多个对象(即本例中的 eout 和 wout)?我确实在 Dirk 的 Rcpp 介绍表中看到了一些关于 list(ret) 的内容,但是当我尝试这个时,我的代码无法编译。任何帮助将不胜感激?
如何删除两个 return
语句并添加:
List ret;
ret["eout"] = eout;
ret["wout"] = wout;
return ret;`
并将 eastC
的 return 类型更改为 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)