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

gmc*_*ulp 1 c++ geocoding r rcpp

晚上好.

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

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

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

谢谢!

格雷琴

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

coa*_*ess 5

没有书?没问题!

首先,通过创建一个了解封装结构封装骨架通过Rcpp.package.skeleton()或使用RStudio的Create an Rcpp Package位.

对于其他一切,在Rcpp的画廊中有很多小插曲和在线的例子.

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

#include "../Include/NYCgeo.h"
Run Code Online (Sandbox Code Playgroud)

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

在尝试使用库头时,应该选择以下两者的包结构:

R/
src/
 |- Makevars
 |- Makevars.win
 |- header.h
 |- action.cpp
man/
DESCRIPTION
NAMESPACE
Run Code Online (Sandbox Code Playgroud)

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

R/
inst/
 |- include/
    |- header.h
src/
 |- Makevars
 |- Makevars.win
 |- action.cpp
man/
DESCRIPTION
NAMESPACE
Run Code Online (Sandbox Code Playgroud)

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

#include <header.h> 
Run Code Online (Sandbox Code Playgroud)

#include "header.h"
Run Code Online (Sandbox Code Playgroud)

现在,话虽如此,当包含标题时,MakevarsMakevars.win文件的内容应该是:/src/inst/include

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
PKG_CPPFLAGS =  -I../inst/include/
Run Code Online (Sandbox Code Playgroud)

第二行是最重要的.

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

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

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