我有一个用C编写的函数,我想从r中编译和调用。它位于ensembleBaggedTreesExtendedStay_V2.c
中,这取决于这些额外的文件:
CompactClassificationTree.c
CompactEnsemble.c
ensembleBaggedTreesExtendedStay_V2_data.c
ensembleBaggedTreesExtendedStay_V2_initialize.c
ensembleBaggedTreesExtendedStay_V2_terminate.c
findNode.c
predictOneWithCache.c
rt_nonfinite.c
rtGetInf.c
rtGetNaN.c
updateCache.c
我如何编译这段代码,然后调用函数(声明如下)在一个R进程?
double ensembleBaggedTreesExtendedStay_V2(
double TransferredYesNo,
double BleedDisYesNo,
double PreOpAlbumin,
double PreOpHCT,
double ASAClass,
double ComplexYesNo);
我尝试创建一个连接所有目标文件的共享库,但我无法从r中调用函数。
下面是文件a.c
与依赖项b.c
的简单示例。当然,根据您的用例,您可以考虑只编写一个包含C源文件的R包,但这超出了问题的范围。
/* a.c */
#include <Rinternals.h>
double add2(double, double);
SEXP R_add2(SEXP x, SEXP y) {
if (LENGTH(x) == 0 || LENGTH(y) == 0)
error("oops");
double *px = REAL(x), *py = REAL(y);
return ScalarReal(add2(px[0], py[0]));
}
/* b.c */
double add2(double x, double y) {
return x + y;
}
那么,在R进程中:
## R CMD COMPILE a.c b.c
tools::Rcmd(c("COMPILE", "a.c", "b.c"))
clang -I"/usr/local/lib/R/include" -DNDEBUG -I/usr/local/include -fPIC -Wall -g -O2 -pedantic -mmacosx-version-min=13.0 -arch arm64 -falign-functions=64 -Wno-error=implicit-function-declaration -flto=thin -c a.c -o a.o
clang -I"/usr/local/lib/R/include" -DNDEBUG -I/usr/local/include -fPIC -Wall -g -O2 -pedantic -mmacosx-version-min=13.0 -arch arm64 -falign-functions=64 -Wno-error=implicit-function-declaration -flto=thin -c b.c -o b.o
## R CMD SHLIB -o ab.so a.o b.o
tools::Rcmd(c("SHLIB", "-o", "ab.so", "a.o", "b.o"))
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -Wall -g -O2 -pedantic -mmacosx-version-min=13.0 -arch arm64 -falign-functions=64 -Wno-error=implicit-function-declaration -flto=thin -fPIC -Wl,-mllvm,-threads=4 -L/usr/local/lib/R/lib -L/usr/local/lib -o ab.so a.o b.o -L/usr/local/lib/R/lib -lR -Wl,-framework -Wl,CoreFoundation
dyn.load("ab.so")
.Call("R_add2", 1, 2)
[1] 3