1

初步步骤

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;
}
4

1 回答 1

3

有关“我可以将 R 和 Rcpp 与 Visual Studio 一起使用”的一般问题,请参阅 Rcpp 常见问题解答(tl;博士:不,你不能)。

但在有 Rcpp 之前,已经有 RQuantLib,而且它仍然存在。下载它的源代码,从牛津的“附加”站点下载 quantlib-1.4.zip,然后用它重建 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
  • 供 R 使用的预构建 QuantLib(请参阅我最近的博客文章
  • 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;
}

与您的不同之处仅在于(重要!)对此处使用的插件的引用。

于 2014-03-14T19:59:17.643 回答