这是我在 R 中的第一个程序包,我已经有可用的程序包,但是我将删除cpp文件中的某些重写功能,因此我制作了可以使用单个功能的头文件。
如何将此标头放在包中?
请注意,header.h
和header.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
如何解决此错误?
答案 0 :(得分:4)
@RalfStubner在评论中指出,NAMESPACE
文件用于导出和导入 R 函数和数据。
使用 Rcpp 的软件包中NAMESPACE
文件的主要要求是确保:
evalCpp
或sourceCpp
。useDynLib()
提供共享对象的名称,
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/Makevars
和src/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 包之间共享已编译的代码例程。