我有一个将Rcpp用于某些内部功能的 R 包。这些函数不会导出供用户直接访问(请参阅rcpptest存储库中的最小可重现示例)。
我现在尝试将Stan代码添加到src/
安装包时要编译的目录(rcppstan存储库中的可重现示例)。但是,当我修改包以使用 Stan 时,我在 R CMD CHECK 中收到以下错误:
#> ❯ checking R code for possible problems ... NOTE
#> meanC: no visible binding for global variable ‘_rcppstan_meanC’
#> Undefined global functions or variables:
#> _rcppstan_meanC
事实上,当我尝试调用使用该meanC
函数的 R 函数时,我收到一条错误消息Error in meanC(x) : object '_rcppstan_meanC' not found
。
据我所知,这是当我修改包以使用rstan时发生的变化,因此可能是原因。
仅使用Rcpp时,以下内容位于
src/RcppExports.cpp
:static const R_CallMethodDef CallEntries[] = { {"_rcpptest_timesTwo", (DL_FUNC) &_rcpptest_timesTwo, 1}, {NULL, NULL, 0} }; RcppExport void R_init_rcpptest(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); }
合并Stan后,文件中不再生成该代码
src/RcppExports.cpp
。相反,这似乎是由rstantools包src/init.cpp
创建的文件处理的。该文件中的相关块在这里:static const R_CallMethodDef CallEntries[] = { {NULL, NULL, 0} }; void attribute_visible R_init_rcppstan(DllInfo *dll) { // next line is necessary to avoid a NOTE from R CMD check R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, TRUE); // necessary for .onLoad() to work }
为什么中的代码src/init.cpp
使Rcpp函数未定义?相反,有没有一种方法可以编辑src/init.cpp
,以便Stan模型能够正确编译和访问,同时仍然允许定义Rcpp函数?