rcpp在基础环境中更新数据

时间:2015-05-20 19:26:48

标签: r rcpp

我正在研究Rcpp中的一个简单的匹配算法,它采用了许多个体(I),一些学校(J),一些提交的选择(nc),个人(pos)的优先级排序,空缺数量(emp)和真正的选择..

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
NumericVector gs2(int I, int J, int nc, NumericVector pos, NumericVector emp, NumericMatrix choices) {
    NumericVector admits(J);
    NumericVector out(I);
    std::fill(out.begin(),out.end(),J+1);
     for (int i=0;i<I;i++){
    NumericVector apply = choices(pos(i),_)-1;
     for (int j=0;j<nc;j++){
     if (emp(apply(j))>0)
     { 
      out(pos(i)) = apply(j)+1;
      admits(apply(j)) = admits(apply(j)) + 1;
      emp(apply(j))  = emp(apply(j)) - 1;
      break;
     }
     }
     }
   return out;
}

代码工作正常..除了它看起来它正在弄乱我的数据..运行代码后我的大小变量已被更改...我错过了什么?感谢

set.seed(123) 
rank      = (1:20)-1
stuchoice = matrix(sample(1:3,6*20,replace=T),byrow=T,ncol=6,nrow=20) 

size = c(7,11,4)

gs2(20,3,6,rank,size,stuchoice)
size

1 个答案:

答案 0 :(得分:3)

您的size变量正在发生变化,因为您要在C ++代码中更改它。特别是这一行:

emp(apply(j))  = emp(apply(j)) - 1;

Rcpp通过引用传递变量,因此您对其内部所做的任何操作都将反映在您的顶部R变量中。如果你想避免这种情况,那么你想要clone你的变量。将代码更改为以下内容可以解决问题。

#include <Rcpp.h>
using namespace Rcpp;

// Note the change in the name of 'emp' to 'emp_'!!!

//[[Rcpp::export]]
NumericVector gs2(int I, int J, int nc, NumericVector pos, NumericVector emp_, NumericMatrix choices) {
    NumericVector admits(J);
    NumericVector out(I);

    // clone your emp
    NumericVector emp = clone(emp_);

    std::fill(out.begin(),out.end(),J+1);
     for (int i=0;i<I;i++){
    NumericVector apply = choices(pos(i),_)-1;
     for (int j=0;j<nc;j++){
     if (emp(apply(j))>0)
     { 
      out(pos(i)) = apply(j)+1;
      admits(apply(j)) = admits(apply(j)) + 1;
      emp(apply(j))  = emp(apply(j)) - 1;
      break;
     }
     }
     }
   return out;
}

测试

library(Rcpp)
sourceCpp("test.cpp")

set.seed(123) 
rank      = (1:20)-1
stuchoice = matrix(sample(1:3,6*20,replace=T),byrow=T,ncol=6,nrow=20) 

size = c(7,11,4)

gs2(20,3,6,rank,size,stuchoice)
size
[1]  7 11  4