当 C header 函数从另一个导出时,将它们导入 R 包的正确方法是什么?
What is the correct way to import C header functions into an R package when they are exported from another?
出于性能原因,我正在使用 R .Call
在 C 级别实现我的 R 包中的功能之一。界面。我希望我的 C 函数能够使用另一个包 (network
) 中定义的一些已经存在的 C 函数来访问和操作数据结构。但是,我是一个C新手,我一直没弄清楚如何正确设置/修改network
中的C函数注册和我的包中的导入定义,以便我可以直接调用C代码而不在我的包中创建代码的副本。
CRAN 文档
https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Linking-to-native-routines-in-other-packages 似乎说 cross-package 链接是可能的,lme4
和 Matrix
包提供了一个例子。 (我可以在 Matrix
的 init.c 文件中找到 R_RegisterCCallable
,但我无法在 lme4
中找到相应的 R_GetCCallable
调用。)
也许我缺少的步骤是将 API header 从 network/inst/include 导入我的包的 C src 的正确便携方式?
我的问题与以下三个问题密切相关,但解决方案似乎都使用 Rcpp,因此似乎忽略了导入定义步骤(可能是因为除了像我这样的 C 新手外,每个人都很明显) .
using C function from other package in Rcpp
How do I share C++ functions in Rcpp-based libraries between R packages?
Best way to use c++ code from R package FOO in package BAR
我有一些工作和工作的例子:
- xts 从动物园导入
- RcppRedis 从 RApiSerialize 导入
- RcppKalman(在 GitHub 上)从 expm
导入
当然还有从 Matrix 导入的 lme4 的古老(但更复杂)示例。请注意 导出包 中的 none 使用 Rcpp。即使导入包确实如此,也将其视为一种分散注意力的行为。这是一个普通的 C 接口,所以无论哪个包使用它,它也为此使用普通 C。
出于性能原因,我正在使用 R .Call
在 C 级别实现我的 R 包中的功能之一。界面。我希望我的 C 函数能够使用另一个包 (network
) 中定义的一些已经存在的 C 函数来访问和操作数据结构。但是,我是一个C新手,我一直没弄清楚如何正确设置/修改network
中的C函数注册和我的包中的导入定义,以便我可以直接调用C代码而不在我的包中创建代码的副本。
CRAN 文档
https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Linking-to-native-routines-in-other-packages 似乎说 cross-package 链接是可能的,lme4
和 Matrix
包提供了一个例子。 (我可以在 Matrix
的 init.c 文件中找到 R_RegisterCCallable
,但我无法在 lme4
中找到相应的 R_GetCCallable
调用。)
也许我缺少的步骤是将 API header 从 network/inst/include 导入我的包的 C src 的正确便携方式?
我的问题与以下三个问题密切相关,但解决方案似乎都使用 Rcpp,因此似乎忽略了导入定义步骤(可能是因为除了像我这样的 C 新手外,每个人都很明显) .
using C function from other package in Rcpp
How do I share C++ functions in Rcpp-based libraries between R packages?
Best way to use c++ code from R package FOO in package BAR
我有一些工作和工作的例子:
- xts 从动物园导入
- RcppRedis 从 RApiSerialize 导入
- RcppKalman(在 GitHub 上)从 expm 导入
当然还有从 Matrix 导入的 lme4 的古老(但更复杂)示例。请注意 导出包 中的 none 使用 Rcpp。即使导入包确实如此,也将其视为一种分散注意力的行为。这是一个普通的 C 接口,所以无论哪个包使用它,它也为此使用普通 C。