我正在使用包含C ++代码的knitr编写文档。该代码将与R软件包TMB一起使用。我正在使用.Rnw文件。
我的主要问题是我不知道为代码块引擎指定什么。我已经阅读了有关非R语言的knitr中设置的一些问题,但我的理解是knitr仅支持Rcpp,而不支持简单的C ++代码。另外,这里我想通过TMB编译C ++代码。在理想情况下,我希望在编译knitr文档时在工作目录中创建.cpp文件,以便TMB以后可以访问它们。但是,目前,当我编译knitr文档时,会收到以下警告:
在get_engine(options $ engine)中: 未知语言引擎“ cpp”(必须通过knit_engines $ set()注册)。
这是一个简单的例子。
\documentclass{article}
\begin{document}
<<setup, include=FALSE>>=
library(knitr)
@
<<tmbcpp, eval=FALSE, tidy=FALSE, engine='cpp'>>=
#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() ()
{
DATA_MATRIX(y);
PARAMETER(logitGamma); // Autocorrelation
Type nll = 0.0;
return nll;
}
@
<<compileTMB, cache=TRUE, results="hide">>=
library(TMB)
compile("tmbcpp.cpp", flags="-Wno-unused-variable")
dyn.load(dynlib("tmbcpp"))
@
\end{document}
请注意,这里我不是在评估C ++代码,我认为这样可以解决问题,但是这似乎还不够。
任何帮助将不胜感激。
答案 0 :(得分:0)
我认为我找到了完美的解决方案。按照Ben Bolker的建议使用Rcpp引擎,并使用钩子来编写代码块,如here和here所述。
\documentclass{article}
\begin{document}
<<setup, include=FALSE>>=
library(knitr)
# To write code chunk to the working directory
knitr::knit_hooks$set(write_chunk = function(before, options, envir) {
if (before) {
fileConn <- file(options$label)
writeLines(options$code, fileConn)
close(fileConn)
}
})
@
<<tmbcpp.cpp, write_chunk=TRUE, eval=FALSE, tidy=FALSE, engine='Rcpp'>>=
#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() ()
{
DATA_MATRIX(y);
PARAMETER(logitGamma); // Autocorrelation
Type nll = 0.0;
return nll;
}
@
<<compileTMB, cache=TRUE, results="hide">>=
library(TMB)
compile("tmbcpp.cpp", flags="-Wno-unused-variable")
dyn.load(dynlib("tmbcpp"))
@
\end{document}
只要安装了AndréSimon的精选包:http://www.andre-simon.de/,就不会发出警告或错误。另外,它将文件保存在工作目录中,然后TMB可以访问该文件进行编译和加载。