C++ для TMB, но не Rcpp в knitr

Я пишу документ, используя knitr, который включает в себя код C++. Этот код должен использоваться с пакетом R TMB. Я использую документ.Rnw.

Моя главная проблема заключается в том, что я не знаю, что указать для блока кода. Я прочитал несколько вопросов о настройках в knitr для не-R языка, но я понимаю, что в knitr поддерживается только Rcpp, а не простой код C++. Кроме того, здесь я хочу скомпилировать код C++ через TMB. В идеальном мире мне хотелось бы, чтобы при компиляции документа 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 ответ

Решение

Я думаю, что нашел идеальное решение. Использование движка 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}

Это не дает никаких предупреждений или ошибок, если у вас установлен пакет подсветки от Андре Симона: http://www.andre-simon.de/. Кроме того, он сохраняет файл в рабочем каталоге, который затем доступен TMB для компиляции и загрузки.

Другие вопросы по тегам