Функция, созданная в Rcpp, недоступна после загрузки соответствующего пакета R - PullRequest
1 голос
/ 26 июня 2019

Я использую пользовательский пакет 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.

Переименование функций не решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...