Я некоторое время работал над программой, которую пишу на 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, мог бы написать мне или написать комментарий. Единственное, что я могу найти на справочных форумах, это то, что это «прямо» или «относительно просто», но я понятия не имею, что делать! Пожалуйста помоги!
gsl
? Даже если вы хотите написать код C самостоятельно, просмотр исходного кода должен быть информативным. cran.r-project.org/web/packages/gsl/index. html - person Richie Cotton   schedule 19.07.2012