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

时间:2016-04-28 23:28:47

标签: c++ r geocoding rcpp

晚上好。

目标:我正在尝试使用RtP在运行Windows的计算机上使用RCPP构建基于纽约市城市规划部门Geosupport软件的批量地理编码软件包。除了坐标(包括建筑物识别号和人口普查地理位置)之外,Geosupport还返回了许多有用的信息。我认为这样的一揽子计划有可能对研究纽约市数据的研究人员和社区倡导者非常有用。

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

状态:到目前为止,我已经能够包含头文件并设置工作区。当我尝试使用C库中的函数时遇到问题。我一直在阅读写作R扩展 - 使用Makevars,但我仍然不确定如何继续。我使用RStudio的Rtools和RCPP构建了我的包,并且没有生成makevars文件。我购买了Dirk的书(在与我类似的帖子中引用),但尚未到达。

谢谢!

格雷

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

2 个答案:

答案 0 :(得分:5)

没有书?没问题!

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

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

首先关闭蝙蝠,困难的主要原因是使用:

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

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

当尝试使用库头时,应该选择以下任一的包结构:

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

根据这种方法,您的头文件仅限于包。要在LinkingTo:文件中启用DESCRIPTION方法以及通常更好的包含,您应该瞄准的结构是:

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

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

#include <header.h> 

VS。

#include "header.h"

现在,话虽如此,Makevars中包含标题的Makevars.win中的/src/inst/include文件的内容应为:

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

第二行是最重要的。

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

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

如果您将完整代码编码到GitHub上,可以提供更多帮助。

答案 1 :(得分:1)

我可以使用Coatless&#39;来访问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/