将 Rcpp 与外部 headers 和库同步以构建批量地理编码包

Syncing Rcpp with external headers and libraries to build a batch geocoding package

晚上好。

目标:我正在尝试使用机器 运行ning Windows 上的 RStudio 中的 RCPP,基于纽约市城市规划部的 Geosupport 软件构建批量地理编码包。 Geosupport returns 除了坐标之外还有很多有用的信息,包括建筑物标识号和人口普查地理。我认为这样的软件包有可能对研究纽约市数据的研究人员和社区倡导者非常有用。

背景:Geosupport 可在 NYC DCP website 上免费下载。下载附带一个用于批量地理编码(称为 GBAT)的界面。此外,还提供了 header、数据和库文件,因此用户可以从使用 C、C++ 或 VB 构建的应用程序中进行地理编码。库文件有一个 DLL 扩展名,并且是用 C 语言编译的(不是 C++,我与一位开发人员核实过)。

状态:到目前为止,我已经能够包含 header 文件并设置工作区。当我尝试使用 C 库中的函数时,我 运行 遇到了问题。我一直在阅读 Writing R Extensions - Using Makevars 但我仍然不确定如何继续。我使用 RStudio 的 Rtools 和 RCPP 构建了我的包,但没有生成 makevars 文件。我购买了德克的书(在与我的相似的帖子中被引用)但它还没有到。

谢谢!

格雷琴

更新代码... 2016 年 3 月 5 日在 19:45 EST: 根据 Coatless 的建议,我创建了一个 GitHub repository。我还创建了一个 Makevars.win 和 Makevars 文件,并将我的 header 文件重新定位到 inst/include。 headers 工作正常,但我仍然不知道如何处理这些库。此外,驱动地理编码器的基础数据文件对于 GitHub (1.85 GB) 来说太大了。我将尝试使用家用计算机上的 Git LFS 添加它们。

没有书?没问题!

首先,尝试通过 Rcpp.package.skeleton() 创建 包框架 或使用 RStudio 的 Create an Rcpp Package 位来理解包结构。

对于其他所有内容,vignettes and online in Rcpp's gallery 中有很多示例。

首先,困难的主要原因是使用:

#include "../Include/NYCgeo.h"

这不是一个好的风格,因为它违背了 R 包的典型文件结构。

尝试使用库 headers 时,应选择以下任一包结构:

R/
src/
 |- Makevars
 |- Makevars.win
 |- header.h
 |- action.cpp
man/
DESCRIPTION
NAMESPACE

在这种方法下,您的 header 文件仅限于包。要在 DESCRIPTION 文件中启用 LinkingTo: 方法并通常更好地包含,您应该瞄准的结构是:

R/
inst/
 |- include/
    |- header.h
src/
 |- Makevars
 |- Makevars.win
 |- action.cpp
man/
DESCRIPTION
NAMESPACE

因此,在 action.cpp 文件中,您可以只使用:

#include <header.h> 

对比

#include "header.h"

现在,话虽如此,当 /inst/include 中包含 header 时,/srcMakevarsMakevars.win 文件的内容应该是:

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
PKG_CPPFLAGS =  -I../inst/include/

第二行最重要。

有关文件包含的非常简单的示例,请参阅 sitmo {免责声明:我编写了 R 包}。

有关更激烈和有趣的版本,请参阅 dplyr

如果你把完整的代码扔到GitHub上,可以提供更多的帮助。

我能够使用 Coatless 的响应访问 C 库中的函数 MyLibrary.dll

这是我的目录结构:

R/
inst/
  |- include/
  |- header.h
src/
  |- Makevars
  |- Makevars.win
  |- action.cpp
 bin/
  |- MyLibrary.dll
 man/
 DESCRIPTION
 NAMESPACE

这是我的 Makevars/Makevars.win 文件:

PKG_LIBS = -L../bin -lMyLibrary
PKG_CPPFLAGS =  -I../inst/include/