Rcpp / RcppGSL: ошибка в dyn.load (dllfile); - PullRequest
1 голос
/ 20 июня 2020

Это мой первый вопрос, и я постараюсь написать хороший. Пожалуйста, дайте мне знать, если вам понадобится какая-либо другая информация.

Я собираюсь начать с краткой предыстории, чтобы вы могли понять, что я пытаюсь достичь sh и почему. Затем я задам свой конкретный c вопрос.

В настоящее время я разрабатываю пакет с использованием Rcpp / RcppGSL. Я использую C / C ++, потому что некоторые вычисления, которые я буду делать, будут выполняться над очень большими наборами данных, и они должны быть быстрыми. (Я также ассистент-исследователь; мне не всегда удается выбирать, как мы что-то делать.) Я определенно новичок в отношении C / C ++. И, насколько я понимаю, C является (почти) подмножеством C ++. Итак, я понял, что это означает, что я могу, по сути, импортировать и запускать весь свой код C как код C ++ (без некоторых изменений). Следовательно, я смогу интегрировать свой код C в пакет R с помощью Rcpp / RcppGSL.

После того, как весь мой код C заработал, я приступил к сборке пакета R. Теперь я понимаю, что это была ошибка. Я должен был начать разработку в RStudio.

Я считаю, что у меня проблема с тем, что R не может найти GSL, что заставляет меня думать, что переменная пути неверна. Я думаю, это потому, что я могу заставить данные тестовые функции для R cpp работать вместе с некоторыми из моих собственных тестовых функций. Однако всякий раз, когда я пытаюсь заставить RcppGSL работать, в частности, всякий раз, когда я использую CTRL + SHIFT + L в своем пакете, я получаю следующую ошибку:

Ошибка в dyn.load (dllfile): невозможно загрузить общий объект '/home/max/research/qeadan/rcnetwork/src/rcnetwork.so': /home/max/research/qeadan/rcnetwork/src/rcnetwork.so: неопределенный символ: gsl_vector_allo c

Итак, увидев это, я взглянул на следующие источники: Advanced R от Wickham, R Packages от Wickham, Бесшовная интеграция R и C ++ с R cpp от Eddelbuettel и Writing R Extensions от R Core Team (проверка автора?) И следующие сообщения SO (хотя их было и больше): загрузка заголовков gsl в Предлагается пакет R ; пакет прошился ; и связывание не было . Ничего из того, что я нашел напрямую, , не решает мою проблему.

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

Я включил свой код, NAMESPACE и папку Makevars.in.

Вот версия функции, которую я пытаюсь экспортировать. Я закомментировал строки, требующие других функций, которые я написал в C, но все равно выдает ту же ошибку, что и без новых.

#include <RcppGSL.h>
#include "rootedCorrelationHeaders.h"

using namespace Rcpp;
using namespace RcppGSL;

// [[Rcpp::export]]
Rcpp::List ccm(SEXP datas, SEXP correls, double alpha){

RcppGSL::matrix<double> data = datas;
Rcpp::CharacterVector correl = correls;

//Create C/C++ types
gsl_matrix *cm1, *cm2;


//Get matrix dimensions from GSL matrix
int ROW = (int) data.nrow();
int COL = (int) data.ncol();

//Create structure to hold sorted matrices
//sm *split; //requires outside struct

//Allocate memory to data structure
//split = smAlloc(ROW, COL); //requires outside function

return Rcpp::List::create(Rcpp::Named("Comparison")= ROW,
                          Rcpp::Named("Correl1") = alpha,
                          Rcpp::Named("Correl2") = correl);

} 

Вот мой файл NAMESPACE. Но, честно говоря, я этого не очень понимаю.

useDynLib(rcnetwork, .registration=TRUE)
exportPattern("^[[:alpha:]]+") 
import(RcppGSL)
importFrom(Rcpp, evalCpp, sourceCpp)

Вот мой файл Makevars.in. Опять же, я этого не совсем понимаю.

# Set by configure
GSL_CFLAGS = @GSL_CFLAGS@
GSL_LIBS = @GSL_LIB@
RCPP_LDFLAGS = @RCPP_LDFLAGS@

# Combine with standard arguments for R
PKG_CPPGLAGS = $ (GSL_CFLAGS)
PKG_LIBS = $ (GSL_LIBS) $(RCPP_LDFLAGS)

Наконец, вот соответствующие части файла DESCRIPTION (добавлены в качестве правки в комментарии duckmayr).

License: GPL (>= 2)
LazyData: TRUE
Depends: R (>= 3.6.2)
Imports: 
    Rcpp,
    RcppGSL,
    plot.matrix
LinkingTo:
    Rcpp,
    RcppGSL,
    plot.matrix
SystemRequirements: GNU GSL

Как заключительное примечание: выполнение команды

R.version

дает следующий результат:

platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          4                           
minor          0.0                         
year           2020                        
month          04                          
day            24                          
svn rev        78286                       
language       R                           
version.string R version 4.0.0 (2020-04-24)
nickname       Arbor Day                

Наконец, исправление, которое я видел несколько раз в нескольких сообщениях, - это использование функции

compileAttributes()

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

Заранее большое спасибо за вашу помощь и ваше время.

1 Ответ

1 голос
/ 20 июня 2020

Рассмотрим простой рабочий пример. Я начинаю с копирования того, что включено в пакет:

edd@rob:~$ cp -ax /usr/local/lib/R/site-library/RcppGSL/examples/RcppGSLExample/ /tmp/
edd@rob:~$ cd /tmp/RcppGSLExample/                                                                       
edd@rob:/tmp/RcppGSLExample$ R CMD build .                                                               
* checking for file ‘./DESCRIPTION’ ... OK
* preparing ‘RcppGSLExample’:
* checking DESCRIPTION meta-information ... OK
* cleaning src                       
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
* building ‘RcppGSLExample_0.0.3.tar.gz’
                                                    
edd@rob:/tmp/RcppGSLExample$ R CMD check RcppGSLExample_0.0.3.tar.gz 
* using log directory ‘/tmp/RcppGSLExample/RcppGSLExample.Rcheck’
* using R version 4.0.1 (2020-06-06)
* using platform: x86_64-pc-linux-gnu (64-bit)
* using session charset: UTF-8                                                                           
* checking for file ‘RcppGSLExample/DESCRIPTION’ ... OK
* this is package ‘RcppGSLExample’ version ‘0.0.3’                                                       
* checking package namespace information ... OK
* checking package dependencies ... OK         
* checking if this is a source package ... OK    
* checking if there is a namespace ... OK                                                                
* checking for executable files ... OK          
* checking for hidden files and directories ... OK
* checking for portable file names ... OK
* checking for sufficient/correct file permissions ... OK
* checking whether package ‘RcppGSLExample’ can be installed ... OK
* checking installed package size ... OK
* checking package directory ... OK
* checking DESCRIPTION meta-information ... OK
* checking top-level files ... OK
* checking for left-over files ... OK                                                                    
* checking index information ... OK
* checking package subdirectories ... OK
* checking R files for non-ASCII characters ... OK
* checking R files for syntax errors ... OK
* checking R files for non-ASCII characters ... OK
* checking R files for syntax errors ... OK
* checking whether the package can be loaded ... OK
* checking whether the package can be loaded with stated dependencies ... OK
* checking whether the package can be unloaded cleanly ... OK
* checking whether the namespace can be loaded with stated dependencies ... OK
* checking whether the namespace can be unloaded cleanly ... OK
* checking loading without being on the library search path ... OK
* checking dependencies in R code ... OK
* checking S3 generic/method consistency ... OK
* checking replacement functions ... OK
* checking foreign function calls ... OK
* checking R code for possible problems ... OK
* checking Rd files ... OK
* checking Rd metadata ... OK
* checking Rd cross-references ... OK
* checking for missing documentation entries ... OK
* checking for code/documentation mismatches ... WARNING
Codoc mismatches from documentation object &apos;colNorm&apos;:
colNorm
  Code: function(G)
  Docs: function(M)
  Argument names in code not in docs:
    G
  Argument names in docs not in code:
    M
  Mismatches in argument names:
    Position: 1 Code: G Docs: M

* checking Rd \usage sections ... OK
* checking Rd contents ... OK
* checking for unstated dependencies in examples ... OK
* checking line endings in shell scripts ... OK
* checking line endings in C/C++/Fortran sources/headers ... OK
* checking line endings in Makefiles ... OK
* checking compilation flags in Makevars ... OK
* checking for GNU extensions in Makefiles ... OK
* checking for portable use of $(BLAS_LIBS) and $(LAPACK_LIBS) ... OK
* checking use of PKG_*FLAGS in Makefiles ... OK
* checking compilation flags used ... OK
* checking compiled code ... OK
* checking examples ... OK
* checking PDF version of manual ... OK
* DONE

Status: 1 WARNING
See
  ‘/tmp/RcppGSLExample/RcppGSLExample.Rcheck/00check.log’
for details.

edd@rob:/tmp/RcppGSLExample$ 

(одно ПРЕДУПРЕЖДЕНИЕ - это то, что я исправлю в источниках.) Это должно дать вам рабочий пример.

Если ваш пакет не собирается, сравните его файлы с файлами рабочего примера. Это в DESCRIPTION, NAMESPACE, src/Makevars и других.

Потому что пакет примера маленький, это должно быть быстро. Но трудно дистанционно угадать, какой (возможно, небольшой, но важный) шаг вы могли пропустить.

И последнее, но не менее важное: вам также, конечно, понадобится сам GSL, установленный как пакет времени выполнения и как пакет разработки . Для меня в Ubuntu 20.04 это

edd@rob:/tmp/RcppGSLExample$ dpkg -l| grep libgsl | cut -c-80
ii  libgsl-dev                                 2.5+dfsg-6build1                 
ii  libgsl23:amd64                             2.5+dfsg-6build1                 
ii  libgslcblas0:amd64                         2.5+dfsg-6build1                 
edd@rob:/tmp/RcppGSLExample$ 
...