gpt4 book ai didi

r - 是否在函数中显式调用 return

转载 作者:行者123 更新时间:2023-12-03 04:12:05 30 4
gpt4 key购买 nike

不久前I got rebuked来自 R 核心团队的 Simon Urbanek(我相信)建议用户在函数末尾显式调用 return (不过他的评论已被删除):

foo = function() {
return(value)
}

相反,他建议:

foo = function() {
value
}

可能在这样的情况下是必需的:

foo = function() {
if(a) {
return(a)
} else {
return(b)
}
}

他的评论阐明了为什么除非严格需要而不调用 return 是一件好事,但该评论已被删除。

我的问题是:为什么不调用 return 更快或更好,从而更好?

最佳答案

问题是:为什么不(明确地)调用 return 更快或更好,从而更好?

R 文档中没有做出这样的假设。
主页“功能”说:

function( arglist ) expr
return(value)

不调用return是不是更快?

function()return() 都是原始函数,function() 本身返回最后计算的值,即使不包含 return() 函数。

使用最后一个值作为参数调用 return() 作为 .Primitive('return') 将完成相同的工作,但需要再调用一次。因此,这个(通常)不必要的 .Primitive('return') 调用可能会消耗额外的资源。然而,简单的测量表明,所得差异非常小,因此不能成为不使用显式返回的原因。下面的图是根据以这种方式选择的数据创建的:

bench_nor2 <- function(x,repeats) { system.time(rep(
# without explicit return
(function(x) vector(length=x,mode="numeric"))(x)
,repeats)) }

bench_ret2 <- function(x,repeats) { system.time(rep(
# with explicit return
(function(x) return(vector(length=x,mode="numeric")))(x)
,repeats)) }

maxlen <- 1000
reps <- 10000
along <- seq(from=1,to=maxlen,by=5)
ret <- sapply(along,FUN=bench_ret2,repeats=reps)
nor <- sapply(along,FUN=bench_nor2,repeats=reps)
res <- data.frame(N=along,ELAPSED_RET=ret["elapsed",],ELAPSED_NOR=nor["elapsed",])

# res object is then visualized
# R version 2.15

Function elapsed time comparison

上图在您的平台上可能略有不同。根据测量的数据,返回对象的大小不会造成任何差异,重复次数(即使按比例放大)只会产生非常小的差异,这在真实数据和真实算法的现实世界中无法计算或使您的脚本运行速度更快。

不调用 return 会更好吗?

Return 是一个很好的工具,可以清晰地设计例程应该结束、跳出函数并返回值的代码“叶子”。

# here without calling .Primitive('return')
> (function() {10;20;30;40})()
[1] 40
# here with .Primitive('return')
> (function() {10;20;30;40;return(40)})()
[1] 40
# here return terminates flow
> (function() {10;20;return();30;40})()
NULL
> (function() {10;20;return(25);30;40})()
[1] 25
>

这取决于程序员的策略和编程风格,他使用什么风格,他可以不使用 return(),因为它不是必需的。

R 核心程序员使用这两种方法,即。有或没有显式 return(),因为可以在“基本”函数的源中找到。

很多时候只使用 return()(无参数)在有条件地停止函数的情况下返回 NULL。

尚不清楚它是否更好,因为使用 R 的标准用户或分析师无法看到真正的差异。

我认为问题应该是:使用来自 R 实现的显式返回是否有任何危险?

或者,也许更好的是,编写函数代码的用户应该始终问:使用显式返回(或将要返回的对象作为代码分支的最后一个叶子)的效果是什么函数代码?

关于r - 是否在函数中显式调用 return,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11738823/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com