Вызов QuantLib из R через Rcpp
Предварительные шаги
QuantLib был установлен вместе с Boost и собран в соответствии с этими инструкциями в Microsoft Visual C++ 2010; Тестовый код прошел без проблем.
Использование R со следующим примером кода дало ожидаемые результаты:
install.packages("Rcpp")
library(Rcpp)
cppFunction('
int add(int x, int y, int z) {
int sum = x + y + z;
return sum;
}'
)
add(1, 2, 3)
# > add(1, 2, 3)
# [1] 6
Что касается использования отдельных файлов C++, пример ниже
#include <Rcpp.h>
using namespace Rcpp;
// Below is a simple example of exporting a C++ function to R. You can
// source this function into an R session using the Rcpp::sourceCpp
// function (or via the Source button on the editor toolbar)
// For more on using Rcpp click the Help button on the editor toolbar
// [[Rcpp::export]]
int timesTwo(int x) {
return x * 2;
}
удалось за результат в R
было
> timesTwo(7)
[1] 14
Я думаю, что все в порядке.
Мой вопрос
Если мои настройки верны, мой вопрос таков: QuantLib-vc100-mt-gd.lib
библиотека объектных файлов находится в C:\DevTools\QuantLib-1.3\lib
, что я должен сделать, чтобы заставить что-то вроде кода ниже работать должным образом, если вызывается из R
?
#include <ql/quantlib.hpp>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double timesTwo(double x) {
QuantLib::Calendar myCal = QuantLib::UnitedKingdom();
QuantLib::Date newYearsEve(31, QuantLib::Dec, 2008);
QuantLib::Rate zc3mQuote = x;
return zc3mQuote * 2;
}
1 ответ
Пожалуйста, смотрите Rcpp FAQ для общего вопроса "могу ли я использовать R и Rcpp с Visual Studio" (tl;dr: Нет, вы не можете).
Но до появления Rcpp уже существовал RQuantLib, и он все еще существует. Загрузите его источники, загрузите quantlib-1.4.zip с сайта "extras" в Оксфорде и просто пересоберите RQuantLib вместе с ним. Который использует Rcpp.
Затем вы можете расширить RQuantLib до вашего сердца.
В новейшей RQuantLib также есть плагин, похожий на тот, что есть у RcppArmadillo и RcppEigen, так что вы можете создавать быстрые маленькие тестовые файлы, подобные тому, который вы опубликовали. Я постараюсь продолжить в выходные с примером доказательства существования.
Изменить: как и обещал, я дал этому попробовать. С текущими RQuantLib (0.3.12) и Rcpp (0.11.1, выпущенными сегодня, но 0.11.0 должен работать), и ваш файл сохранится в /tmp/lisaann.cpp
это "просто работает":
R> library(Rcpp)
R> sourceCpp("/tmp/lisaann.cpp")
R> timesTwo(1.23)
[1] 2.46
R>
Если это не работает в Windows, убедитесь, что
- Rtools установлен
- предварительная сборка QuantLib для использования R (см. мой недавний пост в блоге)
- установить переменные среды, которые
src/Makevars.win
надеется
Иначе, просто используйте Ubuntu, Debian или любую другую нормальную ОС на виртуальной машине.
Редактировать 2: Одна важная часть, однако, это то, что [[ Rcpp::depends() ]]
атрибут добавлен в ваш код. С этим вот файл, который я использовал:
#include <ql/quantlib.hpp>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::depends(RQuantLib)]]
// [[Rcpp::export]]
double timesTwo(double x) {
QuantLib::Calendar myCal = QuantLib::UnitedKingdom();
QuantLib::Date newYearsEve(31, QuantLib::Dec, 2008);
QuantLib::Rate zc3mQuote = x;
return zc3mQuote * 2;
}
который отличается от вашего только (важно!) ссылкой на плагин, используемый здесь.