当前位置: 首页 > 知识库问答 >
问题:

是否在函数中显式调用return

曹成双
2023-03-14
foo = function() {
  return(value)
}
foo = function() {
  value
}
foo = function() {
 if(a) {
   return(a)
 } else {
   return(b)
 }
}

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

共有1个答案

闻人昊昊
2023-03-14

问题是:为什么不(显式地)调用return更快或更好,从而更可取?

R文档中没有任何声明做出这样的假设。
主页?'function'表示:

function( arglist ) expr
return(value)

不叫返回更快吗?

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
# 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
> 

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

R核心程序员使用这两种方法。在base函数的源代码中可以找到显式return()和不显式return()。

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

目前还不清楚它是否更好,作为标准用户或分析师,使用R不能看到真正的区别。

我的观点是,问题应该是:使用来自R实现的显式返回是否有危险?

 类似资料:
  • 我传递给Builder的lambda被填充到对象中,并定期(每小时)调用以刷新其他成员。它第一次被成功调用。我不确定lambda是否保留了,来合法地调用反向JNI函数? 我好像收到了11号信号错误,西格夫。这种分段错误是否可以以任何方式捕获,这样应用程序就不会崩溃? 它似乎在-

  • 问题内容: 我正在用Python编程,我想知道是否可以测试代码中是否已调用函数 我该怎么做? 问题答案: 如果该函数知道其自己的名称是可以的,则可以使用function属性: 您还可以使用装饰器设置属性:

  • 问题内容: 最近,我将Swing应用程序转换为Webstart。这个过程非常简单,但是我发现在关闭所有窗口之后,应用程序的JVM没有终止。线程转储显示有两个非守护进程线程,特别是Swing的EDT,AWT和几个与Websart相关的线程。 实际使用的策略是,每个窗口在创建时都会增加一个计数器,在关闭时会减少一个。默认关闭操作为DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释

  • 问题内容: 我想知道它是否是反模式,或者是否以某种方式影响组件,例如: 问题答案: 我认为一般来说,人们避免在render中定义函数,但是根据这篇博客文章,这并不是一个坏习惯。该博客文章重点介绍了在render中定义的内联事件处理函数,但我想它适用于render中定义的任何函数。在渲染器中定义函数意味着每次调用渲染器时都要重新定义它们的开销,但这可能不会因组件而导致明显的性能差异。 对于您给出的特

  • 问题内容: 如果返回错误,是否仍在调用? 问题答案: 不,延迟功能不会运行。 这是log.Fatal的描述: 致命等同于Print(),然后调用os.Exit(1)。 呼叫,其描述在这里: 退出使当前程序以给定的状态码退出。按照惯例,代码零表示成功,代码零表示错误。程序立即终止;延迟功能未运行。 示范 如果您确实需要在程序完成之前正确关闭资源或执行某些任务,请不要使用。

  • 我试图在反应应用程序中显示时间,并希望以12小时的格式显示。 我编写了一个函数,如果小时数显示为13或以上,则删除“12”。我想将该函数传递到setState,但仍然会得到一个语法错误。 我希望看到下午1:31,但我只是在setState行中出现了语法错误。我无法忘记这一点。 除此之外,我在之前的状态下如何通过?