Предварительные шаги
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;
}
См. Часто задаваемые вопросы о Rcpp для общего вопроса "могу ли я использовать 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, убедитесь, что
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;
}
который отличается от вашего только ссылкой (важная!) на используемый здесь плагин.