- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近发现了 TMB 的神奇之处,并且我正在开发一个包,理想情况下,它会在其中包含 TMB c++ 模板,以用于计算成本相当高的模型。
我假设有可能:
但我在 TMB 文档中找不到关于此的任何明确指南。截至目前,我的替代方案是编写在第一次调用使用未编译类的函数时编译 TMB 代码的函数……但我觉得有更好的方法可以做到这一点。
有没有人成功地将 TMB 功能包含在另一个包中,并能为我指明相关文档或示例的方向?
最佳答案
经过更多搜索,我终于在这个 thread 中找到了我的答案.我想我错过了它,因为它详细说明的决议已移至名为 development 的 wiki 页面,其中的内容专门针对希望为 TMB 的开发做出贡献的用户,而我只想分发代码其中包含 TMB。
总而言之,线程建议了一些我采纳的更改(myPkg 应该是您的包的名称):
.cpp
模板放在mypkg/src
中。这将在您构建包时由 R 自动编译。将这些行添加到您的描述文件中,以便 R 拥有编译模型模板所需的所有工具。
Depends: TMB, RcppEigen
LinkingTo: TMB, RcppEigen
现在我们需要将 TMB 模板添加到命名空间文件中。我们可以通过 roxygen 制作一个像这样的虚拟文件轻松地做到这一点:
#' Roxygen commands
#'
#' @useDynLib myPkg
#'
dummy <- function(){
return(NULL)
}
虚拟函数只是一个借口,可以在我的源代码中某处添加标签 @useDynLib myPkg
,我不会弄乱它。此标记将使用 useDynLib(myPkg)
填充您的 NAMESPACE... 据我了解,这会在为您加载包时加载共享库。
最后,调用MakeADFun
时,设置DLL="myPkg"
。使用此设置,您可以将单个 TMB 模型编译到您的包中。这是因为在你的./src/
文件夹中编译的内容会根据你的包名自动重命名,因此你无法创建唯一命名的模型。
经过更多搜索(与上面引用的线程相同)...我意识到官方 wiki 中描述的解决方案(以及上面详述的)仅与分发单个 dll(即单个 TMB 模型)相关。
如果您想在一个包中分发多个 TMB 模型,则必须使用您自己的 makefile。我已经给出了更详细的描述in my blog ,所以我在这里只简要描述这些步骤与我之前描述的步骤有何不同。
你必须定义你自己的 Makefile
(或 Makefile.win
for windows 用户)并将它放在你的 src/
目录中.这是一个对我有用的例子:
all: template1.so template2.so
# Comment here preserves the prior tab
template1.so: template1.cpp
Rscript --vanilla -e "TMB::compile('template1.cpp','-O0 -g')"
template2.so: template2.cpp
Rscript --vanilla -e "TMB::compile('template2.cpp','-O0 -g')"
clean:
rm -rf *o
对于 windows,将 so
替换为 dll
,并使用相关的编译器标志(用于调试)。有关用于调试的编译器标志的信息,请参阅 ?TMB::compile
。
这与上面略有不同:
#' Roxygen commands
#'
#' This is a dummy function who's purpose is to hold the useDynLib roxygen tag.
#' This tag will populate the namespace with compiled c++ functions upon package install.
#'
#' @useDynLib template1
#' @useDynLib template2
#'
dummy <- function(){
return(NULL)
}
最后,上述更改将编译多个唯一命名的 TMB 模板并将它们加载到命名空间中。要在你的包中调用这些模型,这里有一个例子:
obj <- MakeADFun(data = data,
parameters = params,
DLL="template1",
inner.control = list(maxit = 10000),
silent=F)
当我尝试在 Windows 机器上编译它时遇到问题...结果证明与没有正确清理 src 文件夹有关,我有旧的 linux 编译文件卡在那里。如果您有编译问题,手动清除 src/
目录中以前构建的残留文件是值得的……或者也许有人可以提供一些关于编写更好的 make 文件的好建议!
关于c++ - 在 R 包中包含 TMB c++ 代码的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48627069/
TMB 目标函数似乎是在保存到 .cpp 的一个函数 block 中定义的文件。然后,在编译文件后,通过使用命令加载访问每个目标函数 dyn.load(dynlib()) . 是否可以在每个 .cpp
使用 TMB 生成目标函数和梯度并调用 optim 函数后,我在控制台中打印了一系列报告,其形式似乎为“outer mgc:”: outer mgc: 56.54273 outer mgc: 56
我正在尝试在 R 中使用 gcc (c++) 编译模型(使用 TMB 包)。错误如此之多,以至于在 Rstudio 中,我什至无法向上滚动以查看它们的开头。因此,我想将控制台中的所有内容(消息、错误和
我最近发现了 TMB 的神奇之处,并且我正在开发一个包,理想情况下,它会在其中包含 TMB c++ 模板,以用于计算成本相当高的模型。 我假设有可能: 在包安装时自动编译 TMB 源代码 但我在 TM
我正在开发一个 R 包,以包含在 TMB 中创建的 C++ 模板。使用 this suggestion 中分享的有用指南,我设法走了很长一段路。 目前,我正在使用 2 个 C++ 模板(“kglmer
我是一名优秀的程序员,十分优秀!