编写R代码的最佳实践

时间:2013-02-20 14:40:52

标签: r

您好我刚才有一个关于使用多个函数编写更快的R脚本的快速问题: 假设每个示例中的内容完全相同,以下哪一项运行得更快? 功能中的功能,即

function(args)
{
function_using_previous_function_output(args)
{ manipulation of arguments}

}

将东西传递到彼此之外的函数:

function(args)
{return(output}
}

function_using_previous_function_output(output)
{
manipulation of arguments
}

这些风格或优化是否有最佳实践?

非常感谢!

2 个答案:

答案 0 :(得分:5)

简短回答; 在优化代码方面,你正在寻找错误的途径。

答案很长;

内容几乎总是脚本性能最重要的方面。如果您的代码已经并行化,矢量化,Rcpp-ised和字节编译(require(编译器); enableJIT(3)),并且仍然需要更高速度,那么您应该只是捏造语法。

在不太可能的情况下,您需要更改代码本身的形状以获得速度,这些文章是您的朋友

http://www.r-bloggers.com/speeding-up-r-computations/ http://radfordneal.wordpress.com/2010/08/15/two-surpising-things-about-r/

回答你原来的问题;你应该使用system.time()函数确定效率;我怀疑两种方式都存在统计学上的显着差异

答案 1 :(得分:3)

我一直在编写一个模拟软件包,它使用许多函数根据生物模型的不同过程执行不同的步骤。然后这些函数本身由main函数调用,main函数通过调用它们来进行模拟,偶尔用这些子函数的输出自己做一些东西。关键是它在很大程度上依赖于函数中的函数;当我在主模拟功能中有一系列步骤时,我没有看到太大的速度差异 - 然后整理它我将这些步骤放入子功能。但是我更喜欢它,因为当每个子函数完成时,子函数期间使用但实际上不用于任何结果的任何变量或垃圾或者return()'d在子函数结束时被消除,意味着更少的机会在你不想要时意外修改变量。通常,当你进行循环操作并对其进行矢量化或使用Rcpp在C ++中执行时,R I中的主要速度差异就会出现。 R中的大多数核心内容现在都很快,并且已经是字节编译的。