在过去,我编写了R代码,需要for循环内部的循环.通常,此代码执行起来相当耗时.我在网上看过这是R工作循环的结果.我还读到在R中使用for循环,例如C++或Java,可以加快计算时间.
有没有人有这方面的经验,可以指出一些我能读到的简单例子?
你也可以为for循环调用另一种语言,但循环中的所有内容仍然是标准的R代码吗?
我确实有一些经验,因为我在一个项目中工作,有必要在C中编写一些循环以加速代码.
首先,注意在主Stackoverflow站点上有很多关于R for循环的信息是有用的.例如,在R中加速循环操作的问题至少有两个很好的答案,我发现这些答案非常有用.此外,上面的RomanLuštrik建议的R Inferno有很多好建议.
假设你已经矢量化了所有可以矢量化的东西,尽可能地从循环内部移除,担心这(是一个函数调用,等等,你问:接下来该做什么?
(旁白:据我所知,通过在各个网站上提问,R是用C语言编写的,你在R中编写的几乎所有东西都是C级的函数调用.这意味着如果你一遍又一遍地做事,你应该确保你的代码尽可能少地进行函数调用,因为它们可以真正地加起来,特别是在一个双循环中.这就是为什么有趣的是像括号这样无辜的东西实际上是函数调用.)
在尝试扩展R时,您将被告知要查看的第一个地方是Writing R扩展手册.这对我来说并不是很好,因为它不是用随意的R用户编写的.相反,我发现Matloff的书" The Programming of R Programming"更有帮助.链接是该书的pdf草稿; 这本书本身包含更详细的例子.实际上,我现在看到上面的pdf中没有包含这个例子; 抱歉.
无论如何,事实证明有两种方法可以从R调用C,称为.C和.Call.许多人不推荐使用.C,但它具有易于使用的优点,而倾向于阻止它的人也往往是硬核程序员.
有许多关于如何使用.C接口的在线教程,例如Simon Fraser University的这个例子.基本上,您必须编写要在C中调用的函数,它必须具有返回类型void,并且必须接受指针作为参数.当我第一次开始尝试学习时,我没有尝试过使用C,而且我从一本名为C Steps in Easy Steps的书中学到了我需要知道的东西.另一个免费在线提供的好参考书是Ben Klemens的" 数据建模 "一书,它是一本统计学教科书,它使用C语言作为首选语言,并且没有先验知识.我发现学习指针非常有帮助.
如果您尝试.C"开箱即用"运行示例,则有助于在UNIX环境中工作.我没有使用过其中的一个,而且要在Windows上运行起来要困难得多; 我有一种感觉,许多人觉得使用Windows在某种程度上是邪恶的,并且不愿意帮助那些使用它的人,如果你是一个恰好没有其他选择的数据分析师,那将是一种痛苦.或者这可能是不公平的,使用Windows的人只需要熟悉命令行.
我不想详细介绍如何.C在Windows上工作,以防您不使用它.我可以说的是,我对计算机一无所知,但我确实设法做到了,所以可以做到.
使用较新的替代.C或.Call是RCPP包.Dirk Edelbuettel,包装作者之一,在Stackexchange上非常活跃,如果您对此包或任何其他R/C接口有疑问,很可能会帮助您.正如RomanLuštrik上面所推荐的,这个包可能是一个非常好的选择.我自己没有使用它,因为我还没有能够在Windows下安装它.
至于问题的最后部分,询问是否可以用外语编写for循环然后只在循环中使用R代码,我很确定,不幸的是,没有好办法做到这一点.如果你可以完全跳过必须使用R的话会很棒for,但我不认为它是这样的.但是,如果包含R.h头文件,则可以在C代码中使用各种R函数.同样,很难让它在Windows上运行.特别是,你必须安装一个名为Rtools的东西.但是一旦它工作,编写一小段C代码就像编写相应的R代码一样简单.
无论如何,我希望其中一些参考文献有所帮助.首先尝试的最佳选择是尽可能有效地编写R代码.接下来,尝试Rcpp.如果这不起作用,或者你正在做一些相当小的事情,那么我建议.C.我相信一些专家会提出更好的建议,但我希望得到一位努力解决这些问题的非程序员的答案至少有些有用.
如果你在R中嵌套循环,但没有足够的R经验知道何时使用它们,何时不使用它,你可能没有充分利用该语言.
对于R中的循环并不总是比其他方法慢,比如应用 - 但是有一个巨大的bugbear -
相反,在循环之前使数组成为全尺寸,然后填充它们.
除此之外,经常有一些函数可以执行矢量类型的操作,这些函数非常快,您可以利用这些操作,有时可以加快代码速度,有时还可以组织代码,从而实现速度的显着改善.
你可以使用类似的工具Rccp,inline这可能是一个很大的帮助,但通常你可以在vanilla R.做很多事情.
更明确的帮助取决于您的具体问题.