Каков правильный синтаксис индексации для типов R cpp NumericVector? - PullRequest
1 голос
/ 30 января 2020

Я построил процесс, который будет строить матрицу подобия коэффициентов кости-соренсона, используя R, но с необходимыми циклами он, естественно, работает очень медленно. Я пытаюсь реализовать решение с использованием R cpp, но я полностью застрял в ссылках на векторные знаки с помощью кода c ++, и это не помогает, что я не работал с c ++ почти 7 лет. Предполагаемое поведение для приведенного ниже кода состоит в том, чтобы взять два вектора R различной длины (в среднем около 5-7 элементов), которые имеют сравниваемые значения, и вычислить числитель коэффициента кости как целое число. Векторы будут заполнены значениями с плавающей запятой (342,02; 551,54; et c). Я получаю ошибку компиляции, что «подписанное значение не является массивом, указателем или вектором». Я уже посмотрел этот ответ, а также этот ответ, документы R cpp и cplusplus.com за любую помощь в этом вопросе, но я думаю, что просто нужно, чтобы кто-то указал на очевидную вещь, которую мне явно не хватает. Смотрите код ниже. , .

#include <Rcpp.h>
using namespace Rcpp;
#include <stdio.h>
using namespace std;
#include <cstdlib>

// [[Rcpp::export(name = "diceNumcpp")]]
int diceNum(NumericVector iso1, NumericVector iso2){

  NumericVector is1 = clone(iso1);
  NumericVector is2 = clone(iso2);
  int n = 0;
  int m = 0;
  int match = 0;

  while (is1[n]!=0){      //issue occurs with 'n' reference
    if (is2[m]==0){       //and again here with 'm' reference
      n++;
      m=0;
    }
    if (is1[n]!=0 && is2[m]!=0){  //same issue here with this line and the next
      if (abs(is1[n]-is2[m])/is2[m]<0.01){
        match++;
      }
      m++;
    }
  }
  return match;
}

Буду очень признателен за любую помощь или критику моего ужасного c ++. Спасибо!

РЕДАКТИРОВАТЬ:

Вот некоторые примеры данных.

Код R:

iso1 <- c(595.06, 423.02, 321.06)
iso2 <- c(425.01, 321.06)
iso3 <- c(1476, 382.01)

Ожидаемый выход между iso1 и iso2 = 2, Ожидаемый выход между iso1 и iso3 = 2, и ожидаемый выход между iso2 и iso3 = 0

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 16299)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Rcpp_1.0.3

loaded via a namespace (and not attached):
[1] compiler_3.6.0 tools_3.6.0
...