在 R 脚本上编码而不是使用它的功能更好吗?
is it better to code on R script instead of using its function?
我想问一下,在 r 脚本中使用循环函数比使用它的库 cran 更好吗?比如,我可以编写归一化函数的代码,但我应该为此使用缩放函数吗?
我是数据科学新手。
这不是一个基于意见的问题。答案(如果我理解正确的话)只有一个:使用包函数要好得多,因为它们更快。快得多,快得多。让我介绍一个简单的例子:
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依赖。另一个不依赖于语言的是,例如那个包的功能是经过很多用户测试的,所以比较健壮等等,其实这个话题太宽泛了。
编辑:是的,apply 函数通常比简单的 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
我想问一下,在 r 脚本中使用循环函数比使用它的库 cran 更好吗?比如,我可以编写归一化函数的代码,但我应该为此使用缩放函数吗?
我是数据科学新手。
这不是一个基于意见的问题。答案(如果我理解正确的话)只有一个:使用包函数要好得多,因为它们更快。快得多,快得多。让我介绍一个简单的例子:
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依赖。另一个不依赖于语言的是,例如那个包的功能是经过很多用户测试的,所以比较健壮等等,其实这个话题太宽泛了。
编辑:是的,apply 函数通常比简单的 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