在C ++中修改R对象

时间:2014-09-23 12:31:13

标签: c++ r

我关注以下问题: 在R中分配的C ++中的向量改变导致问题的可能性有多大?

我知道r-developers建议对R对象进行只读访问 如果要修改,我们必须复制东西。 这正是我在一个非常有限的应用程序中试图避免的 框架,这是:

在我调用C ++函数之前,我已经知道我想要返回一个向量 双打,我知道应该多久。 我不想处理外部指针,这似乎不提供方便 解决我想要完成的事情。 所以我采取这种方法: 在调用C ++函数之前,我预先分配了我需要的向量。我通过了这个 vector作为函数的参数,我grep指向数组的指针并修改元素 该数组直接在C ++中。所以我什么都不回。

所以这是我的示例C ++函数(使用inline和RcppEigen):

code <- 

'

int n = *INTEGER(nR);
int p = *INTEGER(pR);

double * xin = REAL(XR);
double * yin = REAL(yR);
double * solin = REAL(solR);

Eigen::Map<Eigen::MatrixXd> X(xin,n,p);
Eigen::Map<Eigen::MatrixXd> y(yin,p,n);
Eigen::Map<Eigen::MatrixXd> sol(solin,n,n);

sol.noalias() = X*y;

'

settings <- getPlugin("RcppEigen")
settings$env$PKG_CXXFLAGS <- paste('-fopenmp -O2 ', settings$env$PKG_CXXFLAGS)
settings$env$PKG_LIBS <- paste('-fopenmp -lgomp', settings$env$PKG_LIBS)

fun <- cxxfunction(signature(XR="numeric", yR="numeric", solR="numeric",nR="intger",pR="integer"), code, plugin="RcppEigen",settings=settings)

现在在R中我会这样做:

n = as.integer(100)
p = as.integer(3000)

X<-matrix(rnorm(n*p),n,p)

# preallocating the solution vector
sol = double(n*n)

# calling the c++ functions while passing the solution vector  
fun(X,t(X),sol,n,p)

# check if we get same results:

dim(sol) <- c(n,n)
all.equal(tcrossprod(X),sol)

这样我避免了不必要的解决方案向量副本。 我玩了一下,我没有遇到问题, 但显然必须有一些,因为这种方法绝对不是 推荐的。 那么我遇到的陷阱是什么?

0 个答案:

没有答案