Есть ли более простой способ написать условные операторы с NumericVector в Rcpp? - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь написать некоторый код, используя Rcpp, и пытаюсь понять, как условные операторы работают между логическими векторами, возникающими из сравнений с использованием NumericVector, и родного типа bool 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 голосов
/ 31 декабря 2018

К сожалению, is_true() и is_false() требуются для использования с функцией all() Rcpp sugar, потому что:

Фактический тип возврата all (X) является экземпляром шаблона SingleLogicalResultкласс, но функции is_true и is_false могут использоваться для преобразования возвращаемого значения в bool.

cf 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...