Rcpp не уверен, какой тип возвращаемого класса должен быть. ошибка: double не может преобразовать в const int & - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь использовать Rcpp в первый раз. Я сделал скрипт на C ++, который отлично работает независимо от R, но при попытке реализовать его в Rcpp я получаю сообщение об ошибке типа возврата. Вот суть того, что я сделал:

cppSim <- '

#include <iostream>
#include <random>
#include <math.h>
//[[Rcpp::plugins(cpp11)]]
#include <Rcpp.h>
#include <cmath>
#include <iomanip>
#include <boost/math/distributions/students_t.hpp>
using boost::math::students_t;


using namespace std;
using namespace Rcpp;

// function to calculate p-value from a t-test

double ttestPValue(vector<double> obs1, vector<double> obs2, int nSamples){ 

    ...

    return(q);  \\ q is a double, this bit works fine
}


NumericVector powerSimulation(int nSamples,  int meanDiff, int nPerm, double pValueCutOff){

    ...

    // create vectors to hold data
    double sim1T[totalRD][nPerm]; 

    ...

    sim1T[rdmu - minRD][j] = ttestPValue(obs1, obs2, nSamples);

    double power[totalRD];
    for (int j = 0; j < 100; j++){
        power[j] = 0;
    }

    for (int i = 0; i < totalRD; i++){
        for (int sum = 0; sum < nPerm; sum ++){         
            if (sim1T[i][sum] < pValueCutOff){
               power[i] = power[i] + 1;
            }
         }
         power[i] = (power[i] / nPerm)*100;
    }

    return power; 
}'

Для запуска я использую:

settings=getPlugin("Rcpp")
settings$env$PKG_CXXFLAGS=paste('-std=c++11',settings$env$PKG_CXXFLAGS,sep=' ')

simRcpp <- cxxfunction(signature(nSamplesR = "int", meanDiffR = "int", nPermR = "int", pValueCutOffR = "double"),
                          plugin="Rcpp", 
                          settings = settings,
                          includes = cppSim,
                          body='
                          int nSamples = Rcpp::as<int>(nSamplesR);
                          int meanDiff = Rcpp::as<int>(meanDiffR);
                          int nPerm = Rcpp::as<int>(nPermR);
                          double pValueCutOff = Rcpp::as<double>(pValueCutOffR);
                          return Rcpp::wrap( cppSim(nSamples, meanDiff, nPerm, pValueCutOff));')

Я получаю ошибку:

file928498473e2.cpp: In function ‘Rcpp::NumericVector powerSimulation(int, int, int, double)’:
file928498473e2.cpp:165:8: error: invalid conversion from ‘double*’ to ‘const int&’ [-fpermissive]
 return power;
        ^

Я понял, что мой тип возврата силы неверен, но как мне сделать это правильно? Я попытался обернуть его как NumericVector, но это, похоже, не работает, и я не могу найти пример с той же проблемой, так как не все используют cxxfunction ().

1 Ответ

0 голосов
/ 28 марта 2019

Пожалуйста, измените

double power[totalRD];

в

std::vector<double> power(totalRD);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...