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

时间:2019-12-10 11:51:00

标签: r rcpp r-package

这是我在 R 中的第一个程序包,我已经有可用的程序包,但是我将删除cpp文件中的某些重写功能,因此我制作了可以使用单个功能的头文件。

如何将此标头放在包中? 请注意,header.hheader.cpp在软件包的src/目录中 而#include "header.h"在我使用此功能的.cpp文件中

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

import(myheader) 

但是,当我这样做时:

R CMD INSTALL mypackage 

我收到此错误:

Error: package or namespace load failed for 'mypackage' in namespaceExport(ns, exports):
 undefined exports: myheader

如何解决此错误?

1 个答案:

答案 0 :(得分:4)

@RalfStubner在评论中指出,NAMESPACE文件用于导出和导入 R 函数和数据。

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

  1. 出于注册原因,导入了包中的 Rcpp 包中的单个功能。
    • 通常使用evalCppsourceCpp
  2. 通过useDynLib()提供共享对象的名称,
    • 这是正在构建的 R 软件包的名称。
importFrom(Rcpp, sourceCpp)
useDynLib(<PACKAGE_NAME_HERE>, .registration = TRUE)

其中<PACKAGE_NAME_HERE>是不带<>的程序包的名称。


如果您对使用标头在 R 软件包之间共享代码感兴趣,请考虑:

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

主要设计模式是使用inst/include目录放置仅标头的库。然后,在src/中将绑定写入库。确保src/Makevarssrc/Makevars.win具有:

# Register where the header files for the package can be found
PKG_CXXFLAGS=-I../inst/include/

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

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

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