方法1
f1 <- function(x)
{
# Do calculation xyz ....
f2 <- function(y)
{
# Do stuff...
return(some_object)
}
return(f2(x))
}
方法2
f2 <- function(y)
{
# Do stuff...
return(some_object)
}
f3 <- function(x)
{
# Do calculation xyz ....
return(f2(x))
}
假定f1
和f3
都进行相同的计算并得出相同的结果。
与方法2相比,使用方法1调用有明显的优势吗?f1()
f3()
在以下情况下某种方法更有利吗?
大数据正在传入和/或传出f2
?
速度是一个大问题。例如,f1
或f3
在模拟中反复调用。
(方法1在软件包中似乎很常见,在另一个软件包中定义)
使用此方法的优点之一f1
是,一旦调用完成(仅在或中调用),f2
就不会在外部存在。f1
f1
f2
f1
f3
定义f2
内部的好处f1
:
f2
仅在内部可见f1
,如果仅在内部使用则很有f2
用f1
,尽管在包命名空间中这是有争议的,因为f2
如果在外部将其定义,则不会导出f2
可以访问中的变量f1
,这可能被视为好事或坏事:
<<-
用来实现记忆等内容。缺点:
f2
每次调用都需要重新定义f1
,这会增加一些开销(不是很多开销,但是肯定有)数据大小无关紧要,因为R不会复制数据,除非在两种情况下都对其进行了修改。正如缺点所指出的那样,定义“f2
外部”f1
应该更快一些,特别是如果您多次重复执行本来相对较低的开销操作。这是一个例子:
> fun1 <- function(x) {
+ fun2 <- function(x) x
+ fun2(x)
+ }
> fun2a <- function(x) x
> fun3 <- function(x) fun2a(x)
>
> library(microbenchmark)
> microbenchmark(
+ fun1(TRUE), fun3(TRUE)
+ )
Unit: nanoseconds
expr min lq median uq max neval
fun1(TRUE) 656 674.5 728.5 859.5 17394 100
fun3(TRUE) 406 434.5 480.5 563.5 1855 100
在这种情况下,我们节省了250ns(编辑:差异实际上是200ns;无论您相信与否,其额外的设置{}
都会fun1
花费另外50ns)。数量不多,但是如果内部功能更复杂或您重复多次该功能,则可以累加。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句