Это мой первый вопрос, и я постараюсь написать хороший. Пожалуйста, дайте мне знать, если вам понадобится какая-либо другая информация.
Я собираюсь начать с краткой предыстории, чтобы вы могли понять, что я пытаюсь достичь 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()
В частности, людям обычно приходится использовать его дважды. Я сделал это, и это ничего не меняет. На самом деле он не выводит никаких результатов в консоль (на всякий случай, это красный флаг).
Заранее большое спасибо за вашу помощь и ваше время.