2015-12-04 23 views
1

由於性能方面的原因,我正在使用R的.Call在C級別上實現R包中的一個函數。接口。我希望我的C函數能夠使用另一個包(network)中定義的一些已經存在的C函數來訪問和操作數據結構。然而,我是C新手,我一直無法弄清楚如何正確設置/修改network中的C函數註冊和我的包中的導入定義,以便我可以直接調用C代碼而不創建我的包中的代碼的副本。將C頭函數從另一個導出時導入R包的正確方法是什麼?

的CRAN文檔 https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Linking-to-native-routines-in-other-packages似乎是說,交聯封裝是可能的,並且該lme4Matrix包提供一個例子。 (我可以找到Matrix的INIT.C文件R_RegisterCCallable,但我一直沒能在lme4找到相應的R_GetCCallable調用)。

也許我缺少的步驟是輸入正確的便攜方式來自network/inst/include的API頭文件放入我的軟件包的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

回答

2

我有幾個工作和工作的例子:

  1. XTS從動物園引進
  2. RcppRedis從RApiSerialize
  3. 進口
  4. RcppKalman(GitHub上)從expm

當然lme4從矩陣進口的雄偉(但更復雜的)例子和進口。請注意,導出程序包均不使用Rcpp。即使導入軟件包的確如此,也只是爲了分散注意力。這是一個普通的C接口,因此無論哪個軟件包使用它都使用普通的C語言。

+0

查看您提供的RcppRedis示例我可以看到'#include '行提供了RApiSerialize在'/ inst/include'目錄中提供的文件的確切名稱。編譯器不需要額外的路徑信息來定位頭文件 – skyebend

+0

正確。 'DESCRIPTION'中的'LinkingTo:'處理路徑。 –

相關問題