在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)
,结果是预期的11
。 R
如何在不知道函数定义的情况下将参数传递给外部函数?调用过程是空白还是R
遵循标准定义,其中SEXP
的类型为n = 1, 2, ..., n1
的n个参数为n个参数?
我知道在没有.Call
的情况下使用Rcpp
界面是过时的,但是我想学习它背后的机制。
先谢谢了。
答案 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。情况是手动编码的。证明外部函数调用为空,换句话说,输入的参数数量直接决定了函数定义。