Обёртывание фортрановой функции в Rcpp

Изначально это показалось мне простой задачей, но я не могу заставить работать следующее. Я пытаюсь заключить фортрановую подпрограмму в вызов Rcpp, чтобы функция была доступна в R для использования. Цель состоит в том, чтобы включить функцию в пакет, поэтому идея использования dyn.load () для конкретного файла * .so неосуществима (если кто-то не может показать мне, как?). Прочитав похожие посты, я подозреваю, что указание флагов в файле makevars может решить проблему, но предоставленная информация очень краткая. Вот и некоторые разъяснения будут искренне оценены.

Я сделал следующее настолько близко к документации, насколько мог.

  1. Создайте структуру пакета с Rcpp.package.skeleton
  2. Поместите мой файл fortran (hello.f) в каталог src
  3. Создан базовый файл cpp для оболочки Rcpp (hello.cpp)
  4. Создайте R-файл, чтобы создать «чистый» вызов функции (т.е. избежать .Call для пользователя и позволяют выполнять другие внутренние вычисления до .Call)

Однако, когда я пытаюсь собрать свой пакет (с помощью RStudio), я получаю следующее сообщение об ошибке:

==> R CMD INSTALL --no-multiarch --with-keep.source fortran

g++ -shared -o fortran.so RcppExports.o hello.o hello.o rcpp_hello_world.o -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
* installing to library ‘/home/.../R/x86_64-pc-linux-gnu-library/3.0’
* installing *source* package ‘fortran’ ...
** libs
hello.o: In function `hello_wrapper':
/home/.../r_code/fortran/src/hello.cpp:16: multiple definition of `hello_wrapper'
hello.o:/home/.../r_code/fortran/src/hello.cpp:16: first defined here
collect2: error: ld returned 1 exit status
make: *** [fortran.so] Error 1
ERROR: compilation failed for package ‘fortran’
* removing ‘/home/.../R/x86_64-pc-linux-gnu-library/3.0/fortran’

Exited with status 1.

Мои файлы следующие:

hello.f

subroutine hello()
print *, "hello world"end subroutine hello

hello.h

extern "C"{
void hello();
}

hello.cpp

#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>

#include "hello.h"
#ifdef __cplusplus
extern "C"{
SEXP hello_wrapper();
}
#endif

SEXP
hello_wrapper ()
{
hello();
}

wrapper.R

hello_r <- function(){
.Call("hello_wrapper");
}

2

Решение

Я считаю, что проблема так же проста, как если бы R был недоволен, когда вы включаете несколько файлов с именем name с разными расширениями. Попробуйте переименовать hello.f в hello_fortran.f и идти оттуда.

1

Другие решения

Я думаю, что это может сработать, если вы удалите

#ifdef __cplusplus
extern "C"{
SEXP hello_wrapper();
}
#endif

часть. Также посмотрите на виньетку Атрибутов Rcpp — вам не нужно писать wrapper.R рукой.

1

Функции RCPP и .Fortran оба не могут существовать одновременно.
Только не включайте функции Фортрана в src/RcppExports.cpp,

0
По вопросам рекламы [email protected]