适用于TMB的C ++,而不适用于knitr中的Rcpp

时间:2019-03-08 00:50:49

标签: r knitr tmb

我正在使用包含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 ++代码,我认为这样可以解决问题,但是这似乎还不够。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为我找到了完美的解决方案。按照Ben Bolker的建议使用Rcpp引擎,并使用钩子来编写代码块,如herehere所述。

\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可以访问该文件进行编译和加载。