“r.h”和“rmath.h”是r.app和c之间接口的头文件,但它们似乎只能通过r命令“r cmd shlib something.c”才能读取。
我希望使用gcc编译我的本地c程序以包含它们。我在找不到头文件的地方用雪豹!
有什么帮助吗?

最佳答案

有关详细信息,请参阅“编写r扩展”手册,您可以很容易地编译并链接到r math.h和独立的r数学库——但不能链接到r.h(您可以通过rcpp/rinside使用该库,但情况不同)。
关于librmath的使用有很多例子,其中一个在手册中。下面是我在包含这个独立数学库的debian包r-mathlib中提供的一个:

/* copyright header omitted here for brevity */

#define MATHLIB_STANDALONE 1
#include <Rmath.h>

#include <stdio.h>
typedef enum {
    BUGGY_KINDERMAN_RAMAGE,
    AHRENS_DIETER,
    BOX_MULLER,
    USER_NORM,
    INVERSION,
    KINDERMAN_RAMAGE
} N01type;

int
main(int argc, char** argv)
{
/* something to force the library to be included */
    qnorm(0.7, 0.0, 1.0, 0, 0);
    printf("*** loaded '%s'\n", argv[0]);
    set_seed(123, 456);
    N01_kind = AHRENS_DIETER;
    printf("one normal %f\n", norm_rand());
    set_seed(123, 456);
    N01_kind = BOX_MULLER;
    printf("normal via BM %f\n", norm_rand());

    return 0;
}

在Linux上,您只需这样构建(当我将库和头放在包中的标准位置时;在OSX上根据需要添加-i和-l)
/tmp $ cp -vax /usr/share/doc/r-mathlib/examples/test.c mathlibtest.c
`/usr/share/doc/r-mathlib/examples/test.c' -> `mathlibtest.c'
/tmp $ gcc -o mathlibtest mathlibtest.c -lRmath -lm
/tmp $ ./mathlibtest
*** loaded '/tmp/mathlibtest'
one normal 1.119638
normal via BM -1.734578
/tmp $

07-24 18:02