我试图建立C++ library Faddeeva的R接口(各种类型的复杂错误函数);不幸的是,我在R中调用外部代码的经验很少,而且它证明是一个很大的挑战。
我天真的尝试,
R CMD SHLIB Faddeeva.cc
生成了一个共享库Faddeeva.so
,我在R中加载
dyn.load("Faddeeva.so")
dlls <- getLoadedDLLs()
getDLLRegisteredRoutines(dlls[['Faddeeva']])
它是空的,我还没有注册任何功能。我相信我必须编写一些接口代码才能使用SEXP,以便我可以使用.Call接口(Rcpp可以让这一步更容易吗?),但是我仍然对这个共享库的原因感到困惑显示没有注册的例程。
欢迎任何有关进行此类项目的建议或指示!
编辑:感谢Dirk对Rcpp的回答和帮助,现在该界面已在Faddeeva package中实现。
答案 0 :(得分:4)
我会退一步看看使用外部库的其他软件包。 oldie但goldie是RcppGSL,但是例如RcppRedis使用(C库)hiredis。
真的没有深刻的魔力:
$em->persist($item);
$em->flush($item);
将ldconfig -p | grep libraryname
添加到src/Makevars
,链接到其他库(应该在您的系统上可见 - 在Linux上PKG_LIBS
)。src/
中并跳过第3步。请注意,我对Rcpp一无所知。它“仅”帮助第2点。其余部分与将C库链接到R扩展名相同。这可能是CRAN上的一千个不同包。
如果您完全迷失了,请考虑the new list r-package-devel,但请先在Writing R Extensions中阅读一下。
Jelmer的包裹nloptr包裹了约翰逊的另一个图书馆:nlopt。也许这可以作为灵感来帮助。我帮助了一点,使安装更有效率(通过使用系统libnlopt
)。
编辑:我仔细查看了page by Johnson。没有图书馆。只需.cc
和.hh
。将这些内容放入您的软件包的src/
,可能会重命名为.cpp
和.h
- 您就完成了!
编辑2:好的,我根据我刚才概述的食谱创建了一个小样本包。通过使用Rcpp,调用者变得像
一样简单#include <Rcpp.h>
using namespace Rcpp;
#include "Faddeeva.h"
// [[Rcpp::export]]
double Dawson(double x) { // special case for real x
return Faddeeva::Dawson(x);
}
我们可以像往常一样使用这个包:
edd@max:/tmp$ Rscript -e 'library(RcppFaddeeva); Dawson(4.2)'
[1] 0.122761
edd@max:/tmp$
我马上把它放在GitHub上。
编辑3:现在是in this GitHub repo。