Rcpp:从Rcpp中的包调用C函数

时间:2015-03-13 08:46:56

标签: r rcpp

我想用Rcpp编写一个C ++函数,该函数使用 hypred 包中的 C 函数,该函数位于CRAN here上。

我看过using C function from other package in Rcpp,但不明白这是否适用于我,是否适用,该怎么办。

所需的功能位于源文件 /src/hypredRoutines.c 中,名为 meiosisFUNAllChr

到目前为止,我基于这个问题here做了什么:

  1. 我将函数 meiosisFUNAllChr 与其余代码分开,并将其放在名为 meiosisFUNAllChr.c 的新文件中。
  2. 我创建了一个名为 meiosisFUNAllChr.h 的头文件,其中包含:

    #ifndef MEIOSISFUNALLCHR_H
    #define MEIOSISFUNALLCHR_H
    void meiosisFUNallChr (...);
    #endif 
    
  3. 编译
    gcc -c -o meiosisFUNAllChr.o meiosisFUNAllChr.c
    
  4. 创建了一个虚拟c ++函数

    #include <Rcpp.h>
    using namespace Rcpp;
    
    extern "C" {
     #include "meiosisFUNallChr.h"
    }
    
    // [[Rcpp::export]]
    int timesTwo(int x) {
     return x * 2;
    }
    
  5. 此时,使用sourceCpp进行编译不起作用。你能告诉我如何让它运作吗?

    非常感谢!

    修改

    使用sourceCpp进行编译可以得到:

    meiosisFUNallChr.h: file or directory not found
    

2 个答案:

答案 0 :(得分:2)

hypred注册了它的两个函数,在R级别你可以得到你想要的那个:

xp <- getDLLRegisteredRoutines( getLoadedDLLs()[["hypred"]] )[[".C"]][["meiosisFUNallChr"]]$address

我相信你可以像这样访问C ++中的函数指针:

DL_FUNC meiosisFUNallChr = reinterpret_cast<DL_FUNC>( R_ExternalPtrAddr(xp) ) ;

但是,如果你能够提出一个你真正需要直接调用C函数的情况,那么你最好与他们实现this scheme的包作者进行协商。

答案 1 :(得分:-1)

简言之:

  • 您想使用其他源文件(可能在合适的许可下提供)。

  • 您想从您的新文件中调用它。

  • 所以你已经有了两个文件。

到现在为止,警报应该消失了你真的,真的,想要创建一个包

许多中的Rcpp文档详细信息。使用Rcpp在CRAN上有340多个软件包,很多人也在调用C文件。选择一两个,研究它们的结构;也选择由完全记录的Rcpp工具创建的一个或两个,如Rcpp.package.skeleton(),事情应该变得更加清晰。

编辑:显然,只有在其他包不导出其功能时才需要采用这种方法。如果您可以让其作者导出,请在Romain的答案中使用它。导出/使用的软件包对是zoo / xts,xts / RcppXts,expm / RcppKalman(不在CRAN上),RApiSerialize / RcppRedis,...