在R脚本上编码而不是使用它的函数更好吗?

时间:2016-02-19 17:00:34

标签: r data-science

我想问一下,在r脚本中使用循环函数而不是使用库库更好吗?比如,我可以编写规范化函数,但是我应该使用scale函数吗?

我是数据科学的新手。

1 个答案:

答案 0 :(得分:1)

这不是基于意见的问题。答案(如果我理解正确的话)只有一个:使用包函数要好得多,因为它们更快。很多,更快。让我举一个简单的例子:

library(microbenchmark)
x <- rnorm(10000)

mysum <- function(x)
{
   sumvar <- 0
   for(el in x)
   {
      sumvar <- sumvar + el  
   }
   sumvar
}

microbenchmark(sum(x), mysum(x))

结果:

Unit: microseconds
     expr      min       lq       mean    median        uq      max neval
   sum(x)    8.086    8.708   10.49947    9.6415   11.6625   24.258   100
 mysum(x) 3266.458 3377.486 3653.57448 3511.6825 3751.1545 5396.202   100

这是因为包函数通常用C / C ++实现,而且速度很快。 R中的循环很慢。非常慢。因此,如果您不想在C / C ++中实现函数并为它们创建R接口,那么最好使用包函数。

当然,这只是一个原因,它依赖于R。不依赖于语言的另一个例如是许多用户都测试了这些包函数,因此它们更加健壮,等等,这实际上是太广泛的主题。

编辑:是的,应用函数通常比简单的for循环好,但它们仍然没有C / C ++实现那么快。我没有花哨的例子,所以这里有一个非常简单的例子(比较三种方法):

makeTwice <- function(x)
{
   ret <- numeric(length(x))
   for(i in 1:length(x))
   {
      ret[i] <- 2*x[i]  
   }
   ret
}
microbenchmark(2*x, unlist(lapply(x, function(el){2*el})), makeTwice(x))

Unit: microseconds
                                           expr       min         lq       mean    median        uq       max neval
                                          2 * x     7.464     8.8635    17.0367    16.794    18.349    69.664   100
 unlist(lapply(x, function(el) {     2 * el }))  6129.545  6818.4150  7786.6555  7265.792  8571.535 14864.356   100
                                   makeTwice(x) 11471.010 12193.3130 14381.6559 13334.380 14313.727 87065.413   100