我想用Rcpp编写一个C ++函数,该函数使用 hypred 包中的 C 函数,该函数位于CRAN here上。
我看过using C function from other package in Rcpp,但不明白这是否适用于我,是否适用,该怎么办。
所需的功能位于源文件 /src/hypredRoutines.c 中,名为 meiosisFUNAllChr 。
到目前为止,我基于这个问题here做了什么:
我创建了一个名为 meiosisFUNAllChr.h 的头文件,其中包含:
#ifndef MEIOSISFUNALLCHR_H
#define MEIOSISFUNALLCHR_H
void meiosisFUNallChr (...);
#endif
用
编译gcc -c -o meiosisFUNAllChr.o meiosisFUNAllChr.c
创建了一个虚拟c ++函数
#include <Rcpp.h>
using namespace Rcpp;
extern "C" {
#include "meiosisFUNallChr.h"
}
// [[Rcpp::export]]
int timesTwo(int x) {
return x * 2;
}
此时,使用sourceCpp进行编译不起作用。你能告诉我如何让它运作吗?
非常感谢!
修改
使用sourceCpp进行编译可以得到:
meiosisFUNallChr.h: file or directory not found
答案 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,...