gpt4 book ai didi

r - R中的函数内部函数

转载 作者:行者123 更新时间:2023-12-04 15:25:19 24 4
gpt4 key购买 nike

此线程讨论了在 R 中的其他函数中使用函数的两种基本方法:What are the benefits of defining and calling a function inside another function in R?

最上面的答案说第二种方法,在外部命名并通过外部函数中的名称调用,速度更快:“每次调用 f1 时都需要重新定义 f2 >,这增加了一些开销(不是很多开销,但肯定有)”。我的问题是,这种开销是由赋值本身还是通过函数本身引起的?

例如,考虑该线程中除两个选项之外的第三个选项:

#Approach 1
fun1a <- function(x) {
fun1b <- function(y){return(y^2)}
return(fun1b(x))
}

#Approach 2
fun2a <- function(y){return(y^2)}
fun2b <- function(x){return(fun2a(x))}

#Approach 3
fun3 <- function(x) {
return(function(x){return(x^2)})
}

已确认方法二比方法一更快,因为方法一需要在函数中反复重新定义fun1b。但是,如果您使用方法 3——基本上是方法 1,但不是每次运行时都将 fun1b 分配给命名函数——是否总是更快?

如果是这样,为什么有人不对所有事情都使用方法 3?即它与方法 2(或 1)相比有什么缺点

最佳答案

其中一些(但不是全部)已在问题的链接中提到,但这里有一个更长的列表。

  1. 可见性 在函数内定义的函数在该函数之外是不可见的,如果该函数未在别处使用,则增加了软件的模块化。它提供了一种穷人的命名空间。例如,在函数内出现的 lapply 中使用匿名函数的替代方法是将其定义为外部函数内的命名函数,以防止它在外部函数外可见。该名称可能构成一种内部函数的文档。

  2. 范围 函数内定义的函数可以访问外部函数中定义的变量,而无需将它们作为参数传递。

  3. 缓存 在函数内定义并传回的函数可以使用外部函数来缓存结果,以便在下次运行传出函数时记住它们。这里的 makeIncr 是一个工厂函数,每次运行时都会构造一个新的计数器函数。每次运行时,计数器函数都会按顺序返回下一个数字。

    makeIncr <- function(init) function() { init <<- init + 1; init }
    counter1 <- makeIncr(0)
    counter1()
    ## [1] 1
    counter1()
    ## [1] 2
    counter2 <- makeIncr(0)
    counter2()
    ## [1] 1
  4. 面向对象 在函数内定义的函数可用于模拟有限形式的面向对象。通过运行查看示例:demo(scoping)

对于函数内的函数,调试可能会有点笨拙。例如,使用上面的 makeIncrdebug(makeIncr) 不会调试必须单独调试的计数器。

我不确定所讨论的性能问题是否真的很重要,因为函数将在第一次运行外部函数时进行字节编译。在大多数情况下,您会希望根据其他因素做出决定。

关于r - R中的函数内部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62359099/

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