Я использую пользовательский пакет R с функцией, написанной на C (хранится в / src). Когда я устанавливаю (devtools :: install ()) и загружаю пакет, функции R доступны для вызова в консоли, но не моя функция C, записанная в файле .cpp в папке / src.
Я попытался повторить пакет с самого начала, используя процедуру, описанную в: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=2ahUKEwiV64ScmYfjAhUSDxQKHQVKAMUQFjACegQIAhAC&url=http%3A%2F%2Fweb.mit.edu%2Finsong%2Fwww%2Fpdf%2Frpackage_instructions.pdf&usg=AOvVaw0jHWALZod_ngv4urh6QrFW, используя RcppArmadillo.package.skeleton ().
Однако команда:
Rcpp:compileAttributes(verbose = TRUE)
вернуть ошибку:
Error in Rcpp::compileAttributes() :
Evaluation error: no native symbols were extracted.
Я попробовал решения, предложенные в этом посте: Rcpp :: compileAttributes () Ошибка
но ничего не помогло, они также вернули "никакие нативные символы не были извлечены".
При использовании примера Rcpp ("anPackage") функция compileAttributes () работает хорошо.
При использовании sourceCpp непосредственно в файле .cpp в / src функция работает хорошо.
Вот что находится перед функцией (в файле .cpp)
#include <string>
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp ;
// [[Rcpp::export]]
SEXP GetBBoxesAsList( SEXP x ){
// determines object type and adapts the search of coordinates
... }
Эта система работала без ошибок, всего несколько дней назад.
Может ли кто-нибудь помочь мне понять, почему моя функция C недоступна для вызова в R? Правильный ли способ вызова Rcpp в файле .cpp?
За исключением функции C, мой пакет работает хорошо при загрузке.
Я на Ubuntu 18.04 и R 3.4.4.
Большое спасибо.
РЕДАКТИРОВАТЬ
Вызов функции C, созданной в /src/myscript.cpp внутри / R / myRscript, вызывает ошибку в
Rcpp:compileAttributes(verbose = TRUE)
функция определяется в src / myscript.cpp как:
// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-
#include "string"
#include "RcppArmadillo.h"
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
SEXP GetBBoxesAsList( SEXP x ){
// determines object type and adapts the search of coordinates
S4 obj(x) ;
std::string nameList;
std::string nameSubList;
if(Rf_inherits(x, "SpatialLines") || Rf_inherits(x, "SpatialLinesDataFrame")){
nameList = "lines";
nameSubList = "Lines";
}else if(Rf_inherits(x, "SpatialPolygons") || Rf_inherits(x, "SpatialPolygonsDataFrame")){
nameList = "polygons";
nameSubList = "Polygons";
}else{
::Rf_error("In GetBBoxes, class must be Spatial[Polygons|Lines][DataFrame]");
}
List a = obj.slot(nameList);
// count items
int nPol = a.length();
// NumericMatrix bboxes(nPol,4);
List bboxes(nPol);
// get the range
for(int iPol = 0;iPol < nPol;iPol++){
S4 pol = a(iPol);
List b = pol.slot(nameSubList);
double minX = std::numeric_limits<double>::infinity();
double maxX = -std::numeric_limits<double>::infinity();
double minY = std::numeric_limits<double>::infinity();
double maxY = -std::numeric_limits<double>::infinity();
for(int iSP = 0; iSP < b.length(); iSP++){
S4 subPol = b(iSP);
NumericMatrix coords = subPol.slot("coords");
// X
NumericVector rangeX = range(coords(_,0));
if(rangeX(0)<minX) minX = rangeX(0);
if(rangeX(1)>maxX) maxX = rangeX(1);
// Y
NumericVector rangeY = range(coords(_,1));
if(rangeY(0)<minY) minY = rangeY(0);
if(rangeY(1)>maxY) maxY = rangeY(1);
}
NumericVector bbox(4);
bbox(0) = minX;
bbox(1) = minY;
bbox(2) = maxX;
bbox(3) = maxY;
bboxes(iPol) = bbox;
// bboxes(iPol,0) = minX;
// bboxes(iPol,1) = minY;
// bboxes(iPol,2) = maxX;
// bboxes(iPol,3) = maxY;
}
// Rcpp::DataFrame BBoxes = Rcpp::DataFrame::create(Rcpp::Named("minX")=bboxes(_,0),
// Rcpp::Named("minY")=bboxes(_,1),
// Rcpp::Named("maxX")=bboxes(_,2),
// Rcpp::Named("maxY")=bboxes(_,3));
return bboxes;// BBoxes;
}
и вызывается в / R / myRscipt как:
# sourceCpp("src/GetBBoxes.cpp")
# see src/GetBBoxes for GetBBoxesAsList
#' @export
GetBBoxes <-function(sp,outType="data.frame"){
out <- GetBBoxesAsList(sp)
if(outType=="data.frame"){
out <- data.frame(matrix(unlist(out),ncol=4,byrow=TRUE))
names(out) <- c("minX","minY","maxX","maxY")
}
return(out)
}
Когда я удаляю вышеуказанную функцию из /R/myRscript.R,
Rcpp::compileAttributes()
Обновляет функцию в R/RcppExports.R.
Переименование функций не решило проблему.