C++ Rcpp数值向量输出仅返回一个值

C++ Rcpp数值向量输出仅返回一个值,c++,r,rcpp,C++,R,Rcpp,因此,我从使用RCPP创建的函数返回值时遇到了一些问题。它只返回NumericVector的第一个值。问题是当我调用函数本身并将NumericVector传递回out变量时。如果您对我所做的错误有任何意见,我们将不胜感激 NumericVector advantage(double tRos, double tTat, double cRos, double cTat){ double tRosAd = 0; double tTatAd = 0; double ja = 0; double ro

因此,我从使用RCPP创建的函数返回值时遇到了一些问题。它只返回NumericVector的第一个值。问题是当我调用函数本身并将NumericVector传递回out变量时。如果您对我所做的错误有任何意见,我们将不胜感激

NumericVector advantage(double tRos, double tTat, double cRos, double cTat){
double tRosAd = 0;
double tTatAd = 0;
double ja = 0;
double rosAtt = 0;
double tatAtt = 0;
double ttlAd = 0;
NumericVector out(1);

if ((tRos >= 0 || cRos >=0) && cRos >= tRos && cTat <= tTat){
    //case 1.1//
    tRosAd = (cRos - tRos) * cTat * -1;
    tTatAd = (tTat - cTat) * tRos;
    out[0] = tRosAd;
    out[1] = tTatAd;
}
else if((tRos >= 0 && cRos >= 0) && cRos <= tRos && cTat >= tTat){
    //case 1.2//
    out = advantage(cRos, cTat, tRos, tTat);
    out[0] = out[0] * -1;
    out[1] = out[1] * -1;
}
else if(tRos >= 0 && cRos <= 0 && tTat >= cTat){
    //case 2.1//
    tRosAd = (tRos - cRos) * cTat;
    tTatAd = (tTat - cTat) * tRos;
    out[0] = tRosAd;
    out[1] = tTatAd;
}
else if(tRos <= 0 && cRos >= 0 && tTat <= cTat){
    //case 2.2//
    out = advantage(cRos, cTat, tRos, tTat);
    out[0] = out[0] * -1;
    out[1] = out[1] * -1;
}
else if(tRos <= 0 && cRos <= 0 && tTat >= cTat & tRos >= cRos){
    //case 3.1//
    tRosAd = (tRos - cRos) * cTat;
    tTatAd = (tTat - cTat) * tRos;
    out[0] = tRosAd;
    out[1] = tTatAd;
}
else if(tRos <= 0 && cRos <= 0 && tTat <= cTat && tRos <= cRos){
    //case 3.2//
    out = advantage(cRos, cTat, tRos, tTat);
    out[0] = out[0] * -1;
    out[1] = out[1] * -1;
}
else if(tRos >= 0 && cRos >=  0 && tTat >= cTat && tRos >= cRos){
    //case 4.1//
    //calculate two attribution advantages//
    tRosAd = (tRos - cRos) * cTat;
    tTatAd = (tTat - cTat) * cRos;
    //calculate total & joint advantage//
    ttlAd = (tTat * tRos) - (cTat * cRos);
    ja = ttlAd - (tRosAd + tTatAd);
    rosAtt = tRosAd / (tRosAd / tTatAd);
    tatAtt = tTatAd / (tRosAd / tTatAd);
    //add joint advantage//
    tRosAd = ja * rosAtt + tRosAd;
    tTatAd = ja * tatAtt + tTatAd;
    out[0] = tRosAd;
    out[1] = tTatAd;
}
else if(tRos >= 0 && cRos >= 0 && tTat <= cTat && tRos <= cRos){
    //case 4.2//
    out = advantage(cRos, cTat, tRos, tTat);
    out[0] = out[0] * -1;
    out[1] = out[1] * -1;
}
else if(tRos <= 0 && cRos <= 0 && tTat <= cTat && tRos >= cRos){
    //case 5.1//
    tRosAd = (tRos - cRos) * tTat;
    tTatAd = (cTat - tTat) * tRos * -1;
    //calculate total and joint advantage//
    ttlAd = (tTat * tRos) - (cTat * cRos);
    ja = ttlAd - (tRosAd + tTatAd);
    rosAtt = tRosAd / (tRosAd + tTatAd);
    tatAtt = tTatAd / (tRosAd + tTatAd);
    tRosAd = ja * rosAtt + tRosAd;
    tTatAd = ja * tatAtt + tTatAd;
    out[0] = tRosAd;
    out[1] = tTatAd;
}
else if(tRos <= 0 && cRos <= 0 && tTat >= cTat && tRos <= cRos){
    //case 5.2//
    out = advantage(cRos, cTat, tRos, tTat);
    out[0] = out[0] * -1;
    out[1] = out[1] * -1;
}
return out;
}
NumericVector优势(双TRO、双tTat、双CRO、双cTat){
双tRosAd=0;
双tTatAd=0;
双ja=0;
双罗萨特=0;
双tatAtt=0;
双ttlAd=0;
数字矢量输出(1);
如果((tRos>=0 | | cRos>=0)和&cRos>=tRos&cTat=0和&cRos>=0)和&cRos=tTat){
//案例1.2//
out=优势(CRO、cTat、tRos、tTat);
out[0]=out[0]*-1;
out[1]=out[1]*-1;
}
否则如果(tRos>=0&&cRos=cTat){
//案例2.1//
tRosAd=(tRos-cRos)*cTat;
tTatAd=(tTat-cTat)*tRos;
out[0]=tRosAd;
out[1]=tTatAd;
}

否则,如果(tRos=0&&tTat=0&&cRos>=0&&tTat,正如哈德利的评论所指出的
NumericVector out(1)
将创建长度为1的新实例

幸运的是,当您通过
out[0]
out[1]
重复访问两个元素时,代码没有爆炸

如果您知道向量的长度
n
,请使用它:
NumericVector out(n)
。否则,请稍后调整大小,尽管这可能会丢失您的内容

如果您不知道向量的长度,请动态增长一个
std::vector
,并在返回到R时进行转换。这两种方法都有许多示例。

NumericVector out(1)
创建长度为1的向量。。。