构建使用c代码库的R包

构建使用c代码库的R包,c,r,C,R,我想提交一个包,但在阅读R存储库策略时,我发现:“源包可能不包含任何形式的二进制可执行代码。”。我目前在../inst中为mac、win和Linux提供了一个二进制可执行文件,该软件包在所有操作系统中都运行良好。然而,我认为克兰不会接受这一点。我已经开始寻找一些信息,但我是C语言的新手,我读到的东西都很混乱。似乎有几种方法可以实现这一点,我不知道哪种方法是最好的 我的二进制可执行文件在目录中需要一个特定的类文件,它由一个函数呈现 我所有的函数都依赖于c库。那么,我应该采取什么行动来获得CRAN的

我想提交一个包,但在阅读R存储库策略时,我发现:“源包可能不包含任何形式的二进制可执行代码。”。我目前在
../inst
中为mac、win和Linux提供了一个二进制可执行文件,该软件包在所有操作系统中都运行良好。然而,我认为克兰不会接受这一点。我已经开始寻找一些信息,但我是C语言的新手,我读到的东西都很混乱。似乎有几种方法可以实现这一点,我不知道哪种方法是最好的

我的二进制可执行文件在目录中需要一个特定的类文件,它由一个函数呈现

我所有的函数都依赖于c库。那么,我应该采取什么行动来获得CRAN的认可呢。。。e、 g,使用Rtools编译并将可执行文件放入
../inst
?将库留在
../inst
中,然后创建一个函数来完成此工作

自学。更新解决问题的步骤:

安装
Rcpp
软件包

install.packages(“Rcpp”)

安装。
R studio
中创建一个类型为“
package w/Rcpp
”的新包,并在“
基于源文件创建包”中选择我的c代码库的主文件。
只是让C/C++代码在不同的系统上编译是一个很深的兔子洞,
这就是像你这样的问题中最棘手的部分

CRAN希望所有需要可执行文件的包都包含其源代码, 以及配置其编译所需的任何内容。 前者意味着您所依赖的任何库都必须具有开放源代码, 以及与CRAN政策兼容的许可证; 后者意味着确保图书馆可以在2015年建成

比如说,, 它本质上是为了R包的使用而包装的。 它包括后者的源代码, 并在其说明中提及相关版权和系统要求 (如CRAN页面所示)。 据我所知, 开发人员必须编写一个文件将其与R集成

这只是一个例子, 不幸的是,没有一个答案适用于所有情况。 看看下面的例子 (向下滚动)

我不是想泄气, 但是将现有的C/C++库与R集成确实很复杂。 如果你想这么做, 你必须有耐心,从基础开始。 如果您需要的库不是开源的, 我怀疑你是否能从起重机上拿到你的包裹。 如果是,请检查它是如何编译为独立的,然后从那里开始

顺便说一句,
Rcpp
并没有将现有库与R集成, 它本质上是一个带有C++接口的包,用于R的C API (除此之外还有一系列额外的功能),
所以这并不是你想要做的最好的例子。

你的分析是正确的:二进制文件不会在CRAN上飞行。所以你需要把它变成一个图书馆。或者,更确切地说,是给克朗的一个包裹

这并不像听起来那么难。首先,如果您编写了二进制代码,您可能知道如何重新组织代码

void main() {
     // preliminary stuff on argc/argv
     // sort our arguments
     // call main function f(a, b, c)
}
如果你能到达那个地方,你就差不多完了。将文件doing
f(a,b,c)
放入
src/
,并使用(相对来说相当简单的)Rcpp code tp将
a
b
c
传递给函数,然后返回结果(可能是一个数字向量)

从vignette开始并从那里开始。

描述了您必须做的事情:将程序转换为库,即一组可调用函数,并将其包含到包中。在这里,我想给出一个非常简短的示例,说明如何执行第二步。请注意,具体细节将取决于函数的签名

让我们从
foo.h
中声明的一个普通C函数开始,它也可以从C++中使用:

\ifdef\uuucplusplus
外部“C”{
#恩迪夫
双名函数(双x);
#ifdef_uucplusplus
}
#恩迪夫
并在
foo.c
中定义:

#包括“foo.h”
双名函数(双x){
返回x*1.234;
}
为了从R调用此函数,我们使用Rcpp编写了一个包装器函数:

#包括
#包括“foo.h”
//[[Rcpp::导出]]
双foo(双x){
返回名称函数(x);
}
所有这些文件都将放置在使用
Rcpp::Rcpp.package.skeleton()
或RStudio中相应函数创建的R包的
src
目录中。调用
Rcpp::compileAttributes()
、构建和安装包(或使用
devtools::load_all()
)后,函数
foo
将可用:

> foo(34.03566)
[1] 42

问这个家伙:,他是Rcpp软件包的作者!非常感谢。在提问之前,我会读完这篇文章:任何评论都会很有帮助。。。快走亚历克西斯:我不同意。“这是最好的[简单的]工具”。R只有一个C接口,所以Rcpp无论如何都在谈论C,我们整天都很高兴地与C库进行接口。我们“只是”有选择做一点C++。“DekdDelBueTeTe足够公平,但是核心Rcpp的目的不是促进与现有C库的集成(在我看来)。它当然会有帮助,但要编译东西仍然很困难。Rcpp的任务是更容易地扩展R。相信我,我说这包括C库。RcppGSL是早期的软件包之一——在GSL端都是C。我的代码是开源的,没有问题。我花了很多时间做这个包,我发现解决方案并不容易。但我想试试。我非常感谢你的帮助。@fina如果这是你的代码,那么德克的答案可能更适用。那个案子没那么复杂,我以为是别人的密码。谢谢@Dirk Eddelbuettel。我的一位同事很久以前就编写了c代码,我对c不太熟悉。