Связывание научной библиотеки GNU с R в Mac OS X

Я некоторое время работал над программой, которую пишу на C, которая запускает MCMC, используя функции из GSL. Я прочитал много документации GNU и написал расширения R, и я много читал об использовании RcppGSL, но мне кажется, что проще написать на C, а затем динамически загрузить функцию в R. Я видел много источников, описывающих, как создать функцию в Windows, но все, что я вижу о том, как использовать ее в системах на базе Unix, заключается в том, что она «относительно проста» и «проста», однако я не могу заставить ее работать.

Сценарий C, который я очень хочу, чтобы кто-то начал работать, прост. Это просто взять массив с заданным количеством строк и столбцов, превратить его в gsl_matrix, а затем снова превратить в массив (это, по сути, то, что делает моя программа в любом случае, за исключением всего изменения того, что представляют собой записи). C-скрипт

#include <R.h>
#include <stdio.h>
#include <gsl/gsl_linalg.h>

void simple( int *n, int *rows, int *cols)
{
  int r,c;
  int Cols = *cols; //This step, and the step below it are unnecessary except for readability
  int Rows = *rows;
  gsl_matrix * m = gsl_matrix_alloc (Rows, Cols); // Declares a gsl_matrix m of size Rows x Cols

  for( r = 0; r< Rows; r++)
    for (c=0; c< Cols; c++)
      gsl_matrix_set(m,r,c, *(n+sizeof(int)*(Cols*r+c))); // The array is organized by rows, sets matrix values

  for( r=0; r< Rows; r++)
    for (c=0; c < Cols; c++)
      *(n+sizeof(int)*(Cols*r+c))=gsl_matrix_get(m,r,c); // This return matrix values to the array (should be the same as before)
}

Что я сделал, так это убедился, что мой терминал (Mac OS X) и R используют один и тот же каталог, в котором сохранен файл simple.c. Я компилирую приведенный выше ввод

R CMD SHLIB simple.c

в мой терминал, чтобы создать соответствующий файл simple.so, также сохраненный на рабочем столе. Тогда в R я могу сделать

dyn.load("simple.so")

Вот где я получаю сообщение об ошибке

Symbol not found: _gsl_matrix_alloc 
Expected in: flat namespace

Меня смущает эта ошибка, потому что кажется, что компилятор распознает файл make < gsl/gsl_linalg.h >, поэтому я предполагаю, что причина, по которой он не распознает функцию, заключается в том, что R не подключен к библиотеке, но я понятия не имею, как это решить .

В этот момент, если бы все функции были распознаваемы, я мог бы затем выполнить функцию в R

x=.C("simple", c(as.integer(c(1,4,7,2,5,8,3,6,9)),as.integer(3),as.integer(3)))

и если моя функция динамически загружается правильно, она будет работать, и я верну для X именно то, что я ввел в качестве второго ввода для .C

Любое понимание было бы чрезвычайно полезно, независимо от того, успешно ли кто-нибудь связал библиотеку GSL с R в Mac OS X, мог бы написать мне или написать комментарий. Единственное, что я могу найти на справочных форумах, это то, что это «прямо» или «относительно просто», но я понятия не имею, что делать! Пожалуйста помоги!


person user1536871    schedule 19.07.2012    source источник
comment
Вы смотрели пакет gsl? Даже если вы хотите написать код C самостоятельно, просмотр исходного кода должен быть информативным. cran.r-project.org/web/packages/gsl/index. html   -  person Richie Cotton    schedule 19.07.2012
comment
Стоит обратить внимание на RcppGSL. Дополнительная информация: dirk.eddelbuettel.com/code/rcpp.gsl.html   -  person dickoa    schedule 19.07.2012
comment
Возможный интерес: stackoverflow.com/q/11346083/420055.   -  person chl    schedule 05.08.2012


Ответы (1)


Вам нужно указать, где находятся функции gsl:

R CMD SHLIB simple.c -lgsl -lgslcblas
person Vincent Zoonekynd    schedule 19.07.2012
comment
... что помимо флагов -l может потребовать -L/path/to/gsl/libraries - person Dirk Eddelbuettel; 19.07.2012