R cpp: путаница с базовой операцией присваивания - PullRequest
0 голосов
/ 06 апреля 2020

В последнее время я пытаюсь работать с пакетом R cpp, чтобы повысить эффективность вычислений в моей работе. Тем не менее, я не очень разбираюсь в C ++, есть некоторые странные поведения, которые я не могу понять. В приведенном ниже примере показаны простые задачи по определению веса NumericVector. Есть несколько вопросов:

  1. Когда я использую WAP = rev (WAP), это приводит к неверному выводу, мне нужно ввести новую переменную для хранения результата, чтобы я получил правильный вывод. Я не знаю, почему, он НИКОГДА не должен использовать операцию 'x = f (x)' в C ++ и R cpp (вместо этого нужно копировать по клону)?

  2. О методе CharacterVector = "eq", именно я хочу использовать тип char или string, однако он не работает с функцией strncmp (теперь я должен использовать метод [0 ]), но я не знаю, как найти API функций R cpp в Rstudio?

  3. Интересно, есть ли в R-стиле функция grep, tolower для условий в R cpp я не знаю, на какой документ мне следует ссылаться, за исключением R cpp suger, чтобы я мог найти доступные базовые функции. В противном случае я думаю о вызове R-функций с помощью R cpp :: function R_grep ("grep"), но я знаю, является ли это наилучшим и рекомендуемым способом.

Любой предложения будут с благодарностью.

#include <Rcpp.h>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector cppweight(int N, CharacterVector method="eq", const bool reverse=false, const bool test=false){
  NumericVector W(N);
  NumericVector WAP(N);
  NumericVector revWAP(N);
  //method=tolower(method); //function not exists

  if(strncmp(method[0],"eq",2)==0){
    W=rep(1,N)/1.0*N;//convert int to float by multiplying 1.0 
    WAP=W/sum(W);
    Rcout<< sum(W) << "\n";
  } else if(strncmp(method[0],"ln",2)==0){
    W=rev(seq(1,N))/1.0*N;
    WAP=W/sum(W);
  }
  if(reverse){
    if(test){
      WAP=rev(WAP);//Why this result in incorrect result
      revWAP=WAP;
    }else{
      revWAP=rev(WAP);
    }
  }else{
    revWAP=WAP;
  }
  return(round(revWAP,3));
}

/*** R
cppweight(6,"ln",reverse=F,test=F)
cppweight(6,"ln",reverse=T,test=F)
cppweight(6,"ln",reverse=T,test=T)
  */

...