2013-08-02 3 views
1

Так что у меня есть небольшая проблема с возвратом значений из функции, созданной с помощью RCPP. Он возвращает только первое значение NumericVector. Проблема заключается в том, что я вызываю функцию внутри себя и передаю NumericVector обратно в переменную out. Любой вклад в то, что я делаю неправильно, получил бы большую оценку.Числовой векторный вывод Rcpp возвращает только одно значение

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; 
} 
+2

'NumericVector out (1)' создает вектор длины 1 ... – hadley

ответ

3

Как комментарий Хедли отметил NumericVector out(1) создает новый экземпляр длины один.

Вам повезло, что код не взорвался, когда вы обратились к двум элементам, которые повторялись через out[0] и out[1].

Если вы знаете длину n вашего вектора, используйте его: NumericVector out(n). Еще раз измените размер, хотя это может потерять ваш контент.

Если вы не знаете длину своего вектора, динамически развивайте std::vector и конвертируйте при возвращении в R. Существует множество примеров для любого подхода.

Смежные вопросы