用于 TMB 的 C++ 但不是 knitr 中的 Rcpp
C++ for TMB but not Rcpp in knitr
我正在使用包含 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++ 代码,我认为这样可以解决问题,但似乎还不够。
任何帮助将不胜感激。
我想我找到了完美的解决方案。按照 Ben Bolker 的建议使用 Rcpp 引擎,并使用钩子编写代码块,如讨论的那样 and 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 可以访问该文件进行编译和加载。
我正在使用包含 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++ 代码,我认为这样可以解决问题,但似乎还不够。
任何帮助将不胜感激。
我想我找到了完美的解决方案。按照 Ben Bolker 的建议使用 Rcpp 引擎,并使用钩子编写代码块,如讨论的那样
\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 可以访问该文件进行编译和加载。