同时注册.C和.Call符号的Rcpp包:compileAttributes()错误地将.C符号导出为.Call符号

问题描述 投票:1回答:1

我主要在Rcpp中编写一个R包(因此使用// [[Rcpp::export]]compileAttributes()导出我的函数),但是我的/ src目录还包括一些从其他包中提取的.c文件。到目前为止,这些都是.Call忠实地找到并导出的compileAttributes()函数,但是现在我遇到了.C函数的问题,不幸的是compileAttributes()也像其他函数一样导出。特别是我的RcppExports.cpp看起来像这样:

#include <Rcpp.h>
using namespace Rcpp;

... all .cpp functions

RcppExport SEXP pacf1(SEXP, SEXP); 
RcppExport void multi_yw(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); // This is the .C function wrongly exported here.
// ... and some other .c functions

static const R_CallMethodDef CallEntries[] = {
    ... all .cpp functions
    {"multi_yw", (DL_FUNC) &multi_yw, 10}, // This is the .C function wrongly exported here.
    {"pacf1",    (DL_FUNC) &pacf1,     2},
    ... and some other .c functions
    {NULL, NULL, 0}
};

RcppExport void R_init_mypackage(DllInfo *dll) {
    R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
    R_useDynamicSymbols(dll, FALSE);
}

代替上面的内容,我当然希望有一个附加的条目,例如:

static const R_CMethodDef CEntries[]  = {
  {"multi_yw", (DL_FUNC) &multi_yw, 10},
  {NULL, NULL, 0}
};

然后最后应该是:

RcppExport void R_init_mypackage(DllInfo *dll) {
    R_registerRoutines(dll, CEntries, CallEntries, NULL, NULL);
    R_useDynamicSymbols(dll, FALSE);
}

那么我在这里可以做什么?我想大概可以删除所有// [[Rcpp::export]]标签并手动设置RcppExports.cpp,但是也许compileAttributes()有解决方案?与此相关,我还想知道是否可以导出带有前缀“ CPP_”的.cpp函数符号,以及其他带有“ C_”前缀的符号,并直接在我的R代码中使用.C / .Call(因为我从不直接使用导出的符号.cpp函数,因此不需要.Call('_mypackage_myfun', ...)生成的R函数包装器compileAttributes()。感谢您的帮助。

我主要在Rcpp中编写一个R包(因此使用// [[[Rcpp :: export]]和compileAttributes()来导出我的函数),但是我的/ src目录还包括一些从其他包中获取的.c文件。 。 ...

r rcpp
1个回答
0
投票

[好,所以我找到了一种解决方法,它使我可以.Call和.C外部函数,还可以通过R代码直接调用自定义的cpp符号:配方为:

© www.soinside.com 2019 - 2024. All rights reserved.