c - R 如何在动态库中提取函数定义
问题描述
当有定义在source.c
like中的函数时
#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
遵循带有 n 个参数类型为SEXP
for的标准定义n = 1, 2, ..., n1
?
我知道不使用.Call
接口Rcpp
是老式的,但我想了解它背后的机制。
提前致谢。
解决方案
感谢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。情况是手工编码的。这证明了外部函数调用是空白的,也就是说,输入参数的数量直接决定了函数的定义。
推荐阅读
- android - 找不到 androidx.compose:compose-compiler:1.0.0-beta03
- c++ - 为什么我们不只通过引用 OpenCV 源代码而不是其二进制文件来开发 OpenCV 应用程序?
- visual-studio-code - 用于 UI 的 VSCode MetaJump?
- redis - 如何使用 redis 命令行订阅 redis?
- extjs4 - ExtJS4 网格和行中显示字段(来自商店的字段)
- css - 混合混合模式饱和度来自什么色彩空间?
- web-component - Svelte Web 组件 - 样式化 Slotted HTML 标签
- python - python中单位的多转换器
- jquery - Jssor slidet ajax 只显示第一个滑块
- python-3.x - 在训练/测试拆分之前进行采样并且精度非常低