R如何在动态库中提取函数定义

时间:2018-10-08 19:40:58

标签: c r

source.c中定义了一个函数,例如

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

SEXP myfunc (SEXP n1, SEXP n2){
    SEXP mysum_sexp;
    PROTECT(mysum_sexp = NEW_NUMERIC(1));
    PROTECT(n1);
    PROTECT(n2);
    NUMERIC_POINTER(mysum_sexp)[0] = NUMERIC_POINTER(n1)[0] 
                                   + NUMERIC_POINTER(n2)[0];
    UNPROTECT(3);
    return(mysum_sexp);
}

source.c文件是使用

编译的
R CMD SHLIB source.c

使用默认名称source.so创建一个动态(共享)库。编译后,当我们输入R

> dyn.load("source.so")

已编译代码中的函数可以使用as调用

> .Call("myfunc", 4, 7)

,结果是预期的11R如何在不知道函数定义的情况下将参数传递给外部函数?调用过程是空白还是R遵循标准定义,其中SEXP的类型为n = 1, 2, ..., n1的n个参数为n个参数?

我知道在没有.Call的情况下使用Rcpp界面是过时的,但是我想学习它背后的机制。

先谢谢了。

1 个答案:

答案 0 :(得分:4)

由于MrFlick,他向我发送了dotcode.c的链接,这种和平的代码解释了我的问题:

switch (nargs) {
case 0:
  retval = (SEXP)ofun();
  break;
case 1:
  retval = (SEXP)fun(cargs[0]);
  break;
case 2:
  retval = (SEXP)fun(cargs[0], cargs[1]);
  break;
case 3:
  retval = (SEXP)fun(cargs[0], cargs[1], cargs[2]);
  break;
case 4:
  retval = (SEXP)fun(cargs[0], cargs[1], cargs[2], cargs[3]);
  break;
case 5:
  .
  .
  .
case 65:
.
.
default:
}

似乎R查看参数的数量并遵循标准定义,该定义在运行时需要多个(或不包含)SEXP参数。允许的最大参数数量为65。众所周知,所有功能都返回SEXP。情况是手动编码的。证明外部函数调用为空,换句话说,输入的参数数量直接决定了函数定义。