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