Rcpp数值矢量输出只返回一个值
Rcpp numeric vector output returns only one value
所以我在从使用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 out(1)
创建了一个长度为1的新实例。
幸运的是,当您访问通过out[0]
和out[1]
重复的两个元素时,代码没有爆炸。
如果您知道向量的长度n
,请使用它:NumericVector out(n)
。否则,稍后调整大小可能会丢失内容。
如果您不知道向量的长度,可以动态地增长std::vector
,并在返回到R时进行转换。这两种方法都有很多例子。
相关文章:
- C++,class,一个返回对象的函数
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 两个相同的重载运算符[]一个返回引用
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 为什么要定义一个返回结构的 lambda 函数,而不是直接定义结构
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 提升:创建一个返回变体的函数
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- 我是否应该将最后一个“返回”语句封装为“else { return .. }',如果它在逻辑上是可选的
- 野牛解析器:创建一个返回令牌的函数
- 为什么 C++ 数组的大小不能有一个返回常量的函数调用
- 如何创建一个返回传递的参数名称的函数
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 将返回的指针分配给另一个返回的指针
- 如何声明一个返回类型是推导出来的函数
- Constexpr语言 - 为什么只是一个返回语句
- 如何创建一个返回护士函数的函数
- 如何用C包装一个返回智能指针的C++函数
- 如何使用两个函数,一个返回迭代器,另一个返回const_iterator