rcpp 更新基础环境中的数据

rcpp updating data in base environment

我正在 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

您的 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