我正在尝试使用Rcpp编写一些代码,并且试图了解逻辑向量之间的条件语句如何工作,因为它们是通过使用NumericVector和C ++的本地布尔类型进行比较而产生的。
我确定的方法如下(最小的可重现示例,我的示例更复杂):
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector compare(NumericVector a, NumericVector b) {
if (is_true(all(b <= a))) {
return a;
}
return b;
}
但是,如果is_true且如果(例如,在我未向您展示的更复杂的情况下)保证a和b的长度均为1,则它们似乎都是多余的。
现在我只是找到了一个令人费解的技巧,还是这是一个不幸的案例,“这是我们所拥有的最好的方法(尽管有这种情况,这种方法的原因胜于反对的理由)” ?
答案 0 :(得分:2)
很遗憾,is_true()
和is_false()
与all()
Rcpp sugar函数一起使用是必需的,因为:
all(X)的实际返回类型是SingleLogicalResult模板类的实例,但是可以使用函数is_true和is_false将返回值转换为bool。
c.f。 http://thecoatlessprofessor.com/programming/unofficial-rcpp-api-documentation/#all
唯一的解决方法是自己实现循环(@Aconcagua提示):
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::NumericVector compare_loop(Rcpp::NumericVector a, Rcpp::NumericVector b) {
if(a.size() != b.size()) Rcpp::stop("Lengths of a and b must be the same.");
for (int i = 0; i < a.size(); ++i) {
// take opposite of comparison or switch it to b[i] > a[i]
if ( !(b[i] <= a[i]) ) {
return b;
}
}
return a;
}
测试:
a = c(-1, 2, 3, 5)
b = c(-3, -2, 4, 3)
all.equal(compare_loop(a,b), compare(a,b))
# [1] TRUE