gpt4 book ai didi

r - 共享库显然不包含任何例程

转载 作者:行者123 更新时间:2023-12-01 12:34:49 25 4
gpt4 key购买 nike

我正在尝试为 C++ library Faddeeva 创建一个 R 接口(interface)(各类复杂误差函数);不幸的是,我在 R 中调用外部代码的经验很少,事实证明这是一个很大的挑战。

我天真的尝试,

R CMD SHLIB Faddeeva.cc

生成了一个共享库 Faddeeva.so,我将其加载到 R 中,

dyn.load("Faddeeva.so")
dlls <- getLoadedDLLs()
getDLLRegisteredRoutines(dlls[['Faddeeva']])

它是空的,我还没有注册任何功能。我相信我必须编写一些接口(interface)代码来使用 SEXP,以便我可以使用 .Call 接口(interface)(Rcpp 可以使这一步更容易吗?),但我仍然对为什么这个共享库显示没有注册例程感到困惑.

我们非常欢迎任何关于开展此类项目的建议或指导!


编辑:感谢 Dirk 的回答和对 Rcpp 的帮助,接口(interface)现在在 Faddeeva package 中实现。 .

最佳答案

我会退后一步,看看其他使用外部库的包。老歌但戈尔迪是RcppGSL , 但例如 RcppRedis使用(C 库)hiredis .

真的没有什么深奥的魔法:

  1. 使用其他库的头文件声明标识符
  2. 编写一个简短的 C++ 文件来部署其中一个标识符
  3. 通过将其添加到 src/Makevars 来链接其他库(它应该在您的系统上可见——在 Linux 上执行 ldconfig -p | grep libraryname)到 PKG_LIBS
  4. 或者,如果您将 Johnson's Fadeeva 的源代码放入包中,只需将文件包含在 src/ 中并跳过第 3 步。

请注意,我没有提及 Rcpp。 .它“仅”有助于第 2 点。其余部分与将 C 库链接到 R 扩展相同。 CRAN 上可能有上千个不同的包。

如果你完全迷路了,考虑the new list r-package-devel但一定要读一点 Writing R Extensions首先。

杰尔默的包裹 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 .

关于r - 共享库显然不包含任何例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30677332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com