我想提高我的C技能,以便更有能力将R代码转换为C,这将是有用的。人们有什么提示可以帮助我?
背景:我几年前参加了一个在线的Intro to C课程,加上编写R扩展和 S编程(Venables& Ripley)使我能够转换对C的瓶颈操作,例如计算子矩阵的乘积(我是否在那里重新发明了轮子?)。但是,我想稍微超出这个范围,例如转换更大的代码块,利用线性代数例程等。
毫无疑问,我可以从我以前使用过的资源中学到更多东西,但我想知道是否有其他人推荐的资源?通过示例显然是了解更多信息的一种方式:Brian Ripley在Efficient Programming in S的研讨会上提供了几个从S原型转移到S + C的例子以及最近的Bioconductor研讨会生物信息学高级研究< / i>(抱歉不能发布超链接)包括编写R + C算法的实验室。更喜欢这个,或其他建议将不胜感激。
答案 0 :(得分:17)
这是一个非常有趣的问题。实际上,我在转移到R之前已经学会了C和C ++,这可能会让我“更容易”将C / C ++添加到R中。
但即使如此,我也是第一个说由于你需要学习的C级不同的宏和R-internals,将纯C添加到R中是非常复杂的。
这引出了我最喜欢的论点:使用额外的抽象层,例如Rcpp包。它隐藏了许多令人讨厌的细节。我希望你不需要知道很多C ++来使用它。使用它的包的一个例子是R-Forge使用的小earthmovdist包 Rcpp包装器类,用于连接一个特定的度量标准。
编辑1:例如,请参阅main function of earthmovdist here哪个应该很容易阅读,可能还有(短) Rcpp包装类包手册 一方。
编辑2:我认为C ++更合适且 R-like 的三个快速原因:
使用Rcpp包装类意味着你永远不会 必须使用PROTECT和UNPROTECT,这是错误和堆的常见来源 如果没有映射则会损坏
使用Rcpp和STL容器类(如vector
等)意味着您永远不必明确调用malloc()
/ free()
或new
/ { {1}}删除了另一个常见的错误来源。
Rcpp允许您将所有内容包装在C ++级别的delete
/ try
块中,并将异常报告回R ---所以没有突然的seg.faults和程序死亡。
也就是说,选择语言是一个非常个人化的决定,许多用户当然对C和R之间的低级接口非常满意。
答案 1 :(得分:14)
我也在努力解决这个问题。
如果问题是要改进C的命令,那么有很多关于这个主题的书籍清单。他们都以K&amp; R开头。我喜欢P. van der Linden的“Expert C Programming”和S. Prata的“C primer”。对C标准库的任何引用都有效。
如果问题是接口C到R,除了前面提到的官方R文档,你可以查看这个Harvard course和quick start guide。我只将标量和数组传递给C,老实说它不知道如何连接复杂的数据结构。
如果问题是将C ++与R接口,或者构建C ++技能,我无法回答,因为我没有使用太多的C ++。对我来说一个很好的起点是“C ++核心语言”(O'Reilly)。非常简单,原始,但对来自C的人有用。
答案 2 :(得分:9)
我的主要建议是查看其他套餐。不用说,所有软件包都不使用C代码,因此您需要找到可以使用的代码。您可以从CRAN下载所有软件包的源代码,在某些情况下, you can also browse them on R-Forge。 Some R projects are also maintained on Google Code或github(for instance, ggplot2)等网站。您将在“src”目录中找到C代码。
一般来说,考虑一下你想要完成什么,然后看看做类似事情的包。
“C编程语言”一书可能仍然是最广泛使用的,因此您可能希望将它放在书架上。以下免费书籍也是一个有用的资源: http://publications.gbdirect.co.uk/c_book/
答案 3 :(得分:3)
“学习C的最佳书籍是什么?”是perenial SO question。 (中间环节可能是最好的。)
至于R特定的学习C的方法,我发现下载R源代码并查看一些.Internal代码是有益的。
编辑:其他人刚刚问过"What to read after K&R?"
答案 4 :(得分:0)
如果您的目标是使用C来消除瓶颈,那么您需要在C中使用一个好的数值库。有很多,但我发现gsl(GNU Scientific Library)非常有用。
http://www.gnu.org/software/gsl/
还有经典着作“C中的数字配方”,它提供了重要数值技术的概述(虽然我不建议逐字使用它们的代码)。