在R包和CRAN中分发TMB功能

时间:2017-09-28 19:50:51

标签: r rcpp tmb

我在/ src中有9个cpp文件 - 来自Rcpp的8个文件和来自TMB的1个cpp文件。我可以编译所有并成功运行代码或通过CRAN检查。但不是两个。

方法1

让R编译所有cpp文件并生成一个DLL:' mypackage.dll'和TMB::MakeADfun(..., DLL="mypackage")

  • 通过所有CRAN检查(除了已安装包装尺寸的注释,见下文)。
  • Rcpp功能正常
  • 调用TMB功能结果: Error in .Call("getParameterOrder", data, parameters, new.env(), PACKAGE = DLL) : "getParameterOrder" not available for .Call() for package "mypackage"
  • 使用TMB::MakeADFun(..., DLL="mypackage", checkParameterOrder=FALSE)会导致: Error in .Call("TMBconfig", e, as.integer(1), PACKAGE = DLL) : "TMBconfig" not available for .Call() for package "mypackage"

方法2

使用' makevars.win'在this suggestion之后,添加useDynLib MyTMBTMB::MakeADfun(..., DLL="MyTMB")并创建两个DLL(mypackage.dll和MyTMB.dll):

makevars.win:

all: MyTMB.dll

MyTMB.dll: MyTMB.cpp
    $(R_HOME)/bin$(R_ARCH_BIN)/Rscript --vanilla -e "TMB::compile('MyTMB.cpp', safebounds=FALSE, safeunload=FALSE)"

clean:
  rm -rf *o
  • Rcpp和TMB功能都可以正常工作
  • devtools :: check()会为每个Rcpp函数生成一个警告:

    checking foreign function calls ... WARNING
        Foreign function calls to a different package:
          .Call("_rcppfunction1", ..., PACKAGE = "mypackage")
    
  • 和一个关于大型安装包大小的说明。 libs子目录超过30 Mb,大约是方法1的两倍。

Rcpp开发人员推荐not to use a makevars file,显然我会覆盖Rcpp中的某些内容,导致外部函数调用'问题,即使包是当前包。看来我的选择是:

  • 修改' makevars'恢复避免警告的Rcpp默认值,并请求CRAN接受有关已安装包大小的说明。不知道如何做前者。
  • 找到方法1问题的修复程序,并请求较小的已安装程序包大小。只有一个dll是最简单的解决方案。不确定问题是否是因为我正在编译Rcpp和TMB,如果是,那么如何修复它。
  • 或其他我不知道的事。

有什么建议吗?

R详情:

平台x86_64-w64-mingw32
拱x86_64
os mingw32
system x86_64,mingw32
状态
专业3 未成年人3.3

0 个答案:

没有答案