gpt4 book ai didi

c++ - 在包 BAR 中使用 R 包 FOO 中的 C++ 代码的最佳方法

转载 作者:可可西里 更新时间:2023-11-01 16:32:33 29 4
gpt4 key购买 nike

我正在尝试使用 Rcpp 定义一个函数来加速。情况如下:

  • 我有一个 FOO 包,里面有很多 C++ 代码(我自己的包,目前没有使用 Rcpp),它定义了一组函数,例如foo_a 和 foo_b。
  • 在另一个包 BAR(使用 Rcpp)中,我正在定义一个函数(使用 Rcpp 属性),我想在其中调用函数 foo_a 和 foo_b。

我该如何解决这个问题?在其他帖子中看了一下我发现我以某种方式在 FOO 中包含头文件并在 BAR 中使用属性 //[[Rcpp::depends(FOO)]] ,但我似乎错过一些点。有关如何操作的任何提示?

最好的拉斯

编辑:感谢您的评论,我喜欢 Kevin Ushey 的方法并尝试实现它。然而,经过一些编码后,我意识到我实际上不需要 FOO 中的函数,而是一个类及其公共(public)函数。我想我不能做你建议的类(class)技巧。我最终将来自 FOO 的类的源文件放在 BAR src 目录中(这不是最好的方法,因为我现在有相同代码的两个版本)。但是目前这个 hack 对我有用。

最佳答案

我会推荐以下选项之一:

如果 foo_afoo_b 足够简单,只需将它们作为 inline 函数放在 FOO 的 header 中即可将这些 header 放在 FOO/inst/include/FOO.h 中。 Rcpp::depends(FOO) 将在您对 BAR

否则,请考虑使用 R 的注册模型注册函数。这是一个多一点的工作,但这是可以忍受的。编写 R 扩展有详细信息。我建议将所有注册逻辑放在 FOO 中,这样客户端包 BAR 只需使用它。例如,我会在 FOO 的 header 中有这样的 foo_a,例如在 FOO/inst/include/FOO.h 中:

#ifdef COMPILING_FOO
inline int foo_a(int x, double y, const std::string& z){
typedef int (*Fun)(int, double, const std::string&) ;
static Fun fun = (Fun)R_GetCCallable( "FOO", "foo_a" ) ;
return fun(x,y,z) ;
}
#else
// just declare it
int foo_a(int x, double y, const std::string& z) ;
#endif

以及 FOO/src 中的一些 .cpp 文件中 foo_a 的实际定义:

#define COMPILING_FOO
#include <FOO.h>

int foo_a(int x, double y, const std::string& z){
// do stuff
}

然后,您需要在函数 R_init_FOO 中使用 R_RegisterCCallable 注册 foo_a:

extern "C" void R_init_FOO( DllInfo* info ){
R_RegisterCCallable( "FOO", "foo_a", (DL_FUNC)foo_a );
}

关于c++ - 在包 BAR 中使用 R 包 FOO 中的 C++ 代码的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20982243/

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