В последнее время я пытаюсь работать с пакетом R cpp, чтобы повысить эффективность вычислений в моей работе. Тем не менее, я не очень разбираюсь в C ++, есть некоторые странные поведения, которые я не могу понять. В приведенном ниже примере показаны простые задачи по определению веса NumericVector. Есть несколько вопросов:
Когда я использую WAP = rev (WAP), это приводит к неверному выводу, мне нужно ввести новую переменную для хранения результата, чтобы я получил правильный вывод. Я не знаю, почему, он НИКОГДА не должен использовать операцию 'x = f (x)' в C ++ и R cpp (вместо этого нужно копировать по клону)?
О методе CharacterVector = "eq", именно я хочу использовать тип char или string, однако он не работает с функцией strncmp (теперь я должен использовать метод [0 ]), но я не знаю, как найти API функций R cpp в Rstudio?
Интересно, есть ли в 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)
*/