Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R包和CRAN检查中分配TMB功能_R_Rcpp_Tmb - Fatal编程技术网

在R包和CRAN检查中分配TMB功能

在R包和CRAN检查中分配TMB功能,r,rcpp,tmb,R,Rcpp,Tmb,我在Rcpp的/src-8中有9个cpp文件,在TMB中有1个。我可以编译所有代码并成功运行,或者通过CRAN检查。但不是两者都有 方法1 让R编译所有cpp文件并生成单个DLL:'mypackage.DLL'和TMB::MakeADfun(…,DLL=“mypackage”): 通过所有起重机检查(除了安装的包装尺寸注释,见下文) Rcpp函数运行良好 调用TMB函数会导致: .Call中出错(“getParameterOrder”,数据,参数,new.env(),PACKAGE=DLL)

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

方法1

让R编译所有cpp文件并生成单个DLL:'mypackage.DLL'和
TMB::MakeADfun(…,DLL=“mypackage”)

  • 通过所有起重机检查(除了安装的包装尺寸注释,见下文)
  • Rcpp函数运行良好
  • 调用TMB函数会导致:
    
    .Call中出错(“getParameterOrder”,数据,参数,new.env(),PACKAGE=DLL):
    “getParameterOrder”不适用于包“mypackage”的.Call()
    
  • 使用
    TMB::MakeADFun(…,DLL=“mypackage”,checkParameterOrder=FALSE)
    会导致:
    
    .Call中出错(“TMBconfig”,e,as.integer(1),PACKAGE=DLL):
    “TMBconfig”不适用于包“mypackage”的.Call()
    
方法2

使用下面的“makevars.win”,添加
useDynLib MyTMB
TMB::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开发人员推荐,很明显,我正在覆盖Rcpp中的某些内容,以导致“外部函数调用”问题,即使包是当前包。我的选择似乎是:

  • 修改“makevars”以恢复避免警告的Rcpp默认值,并请求CRAN接受关于已安装软件包大小的说明。不知道如何做前者
  • 找到解决方法1问题的方法,并请求安装较小的软件包。只有一个dll是最简单的解决方案。不确定问题是否是由于我同时编译Rcpp和TMB引起的,如果是,如何修复它
  • 或者其他我错过的东西
有什么建议吗

R详细信息:

平台x86_64-w64-mingw32
拱门x86_64
os mingw32
系统x86_64,mingw32
状态
专业3

minor 3.3

GetPareMetErrorder错误是因为缺少dyn.load()?我应该说清楚-我在方法1的命名空间中使用了
useDynLib(mypackage)
,Rcpp代码工作正常,即找到dll。抱歉,这没有回答您的问题,但是我想知道如何让方法2从
Rcpp
文件编译
mypackage.dll
?当我使用自定义
makefile.win
编译
TMB
文件时,我得到以下错误:
library.dynam(lib,package,package.lib)中的错误:未找到DLL'debugrcpp':可能未为此体系结构安装?
,也就是说,如果提供了
makefile
,它就不会编译
Rcpp
文件。@Alex你的makefile看起来像我的吗?我的Rcpp是自动编译的,TMB生成文件似乎没有影响它。我的生成文件看起来和你的相似。我使用链接线程中的一个: