在 R 包内的 NAMESPACE 中导入 Rcpp 头文件

mat*_*cci 0 r rcpp r-package

这是我在R中的第一个包,我已经有了工作包,但我会删除 cpp 文件中的一些重写函数,所以我做了一个与单个函数一起使用的头文件。

如何将此标头放入包中?请注意,header.hheader.cpp位于src/包目录中,并且#include "header.h"位于.cpp我使用此函数的文件中

我尝试NAMESPACE用以下方法修改该文件:

import(myheader) 
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时:

R CMD INSTALL mypackage 
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error: package or namespace load failed for 'mypackage' in namespaceExport(ns, exports):
 undefined exports: myheader
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

coa*_*ess 5

正如 @RalfStubner 在评论中指出的那样,该NAMESPACE文件用于导出和导入R函数和数据。

使用Rcpp 的NAMESPACE包中的文件的主要要求是确保:

  1. 出于注册原因, 导入了Rcpp包中的单个函数。
    • 一般情况下,使用evalCpp或。sourceCpp
  2. 通过 提供共享对象的名称useDynLib()
    • 这是正在构建的R包的名称。
importFrom(Rcpp, sourceCpp)
useDynLib(<PACKAGE_NAME_HERE>, .registration = TRUE)
Run Code Online (Sandbox Code Playgroud)

其中<PACKAGE_NAME_HERE>是不带 . 的包的名称<>


如果您有兴趣使用标头在R包之间共享代码,请考虑查看:

https://github.com/r-pkg-examples/rcpp-shared-cpp-functions

主要设计模式是使用inst/include目录来放置仅头文件库。然后,写入src/到库的绑定。确保src/Makevars并且src/Makevars.win具有:

# Register where the header files for the package can be found
PKG_CXXFLAGS=-I../inst/include/
Run Code Online (Sandbox Code Playgroud)

如果您想.cpp在同一R包中的文件之间共享函数定义,请参阅:

https://github.com/r-pkg-examples/rcpp-headers-src

这避免了单个整体.cpp文件,但不允许在导出的R包装器之外的R包之间共享已编译的代码例程。