有没有更简单的方法可以在Rcpp中用NumericVector编写条件语句?

时间:2018-12-31 03:44:46

标签: c++ r rcpp

我正在尝试使用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,则它们似乎都是多余的。

现在我只是找到了一个令人费解的技巧,还是这是一个不幸的案例,“这是我们所拥有的最好的方法(尽管有这种情况,这种方法的原因胜于反对的理由)” ?

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