Rcpp - компиляция вне структуры пакета - PullRequest
0 голосов
/ 27 мая 2018

У меня вопрос об использовании кода C ++ с использованием Rcpp вне структуры пакета.

Чтобы прояснить мои сомнения, рассмотрим код C ++ (test.cpp) ниже:

// [[Rcpp::depends(RcppGSL)]]

#include <Rcpp.h>
#include <numeric>
#include <gsl/gsl_sf_bessel.h>
#include <RcppGSL.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>

using namespace Rcpp;

// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
  return x * 2;
}

// [[Rcpp::export]]
double my_bessel(double x){
  return gsl_sf_bessel_J0 (x);
}

// [[Rcpp::export]]
int tamanho(NumericVector x){
  int n = x.size();

  return n;
}

// [[Rcpp::export]]
double soma2(NumericVector x){
  double resultado = std::accumulate(x.begin(), x.end(), .0);
  return resultado; 
}

// [[Rcpp::export]]
Rcpp::NumericVector colNorm(const RcppGSL::Matrix & G) {
  int k = G.ncol();
  Rcpp::NumericVector n(k);           // to store results
  for (int j = 0; j < k; j++) {
    RcppGSL::VectorView colview = gsl_matrix_const_column (G, j);
    n[j] = gsl_blas_dnrm2(colview);
  }
  return n;                           // return vector
}

Приведенный выше код работает, когда он находится внутри структуры пакета.Как известно, с помощью Rcpp::compileAttributes() создается файл RcppExports.cpp.Поэтому у меня будет доступ к функциям в среде R.

Меня интересует использование функции C ++, реализованной с использованием Rcpp вне рамок пакета.Для этого я скомпилировал код C ++ с использованием компилятора g ++ следующим образом:

g++ -I"/usr/include/R/" -DNDEBUG -I"/home/pedro/R/x86_64-pc-linux-gnu-library/3.5/Rcpp/include" -I"/home/pedro/Dropbox/UFPB/Redes Neurais e Análise de Agrupamento/Rcpp" -I /home/pedro/R/x86_64-pc-linux-gnu-library/3.5/RcppGSL/include -D_FORTIFY_SOURCE=2   -fpic  -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt  -c test.cpp -o test.o -lgsl -lgslcblas -lm
g++ -shared -L/usr/lib64/R/lib -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -o produto.so produto.o -L/usr/lib64/R/lib -lR -lgsl -lgslcblas -lm

Компиляция прошла успешно, и не было выдано предупреждение.Таким образом, файлы test.o и test.so были сгенерированы.Уже в R, используя интерфейс .Call, я сделал:

dyn.load("test.so")

my_function <- function(x){
    .Call("soma2",x)
}

При попытке использовать функцию my_function () возникает ошибка, указывающая, что soma2 отсутствует в таблице загрузки.Есть ли способ создать файл RcppExports.cpp вне рамок пакета?Я думаю, что правильным будет скомпилировать код RcppExports.cpp, а не test.cpp.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 мая 2018

Если вы работаете вне пакета, вы можете просто использовать Rcpp::sourceCpp(<file>).Это позаботится о компиляции, компоновке и получении оболочки R для вас.С вашим файлом я получаю:

> Rcpp::sourceCpp("test.cpp")
> soma2(1:5)
[1] 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...