gpt4 book ai didi

r - 理解 R 函数惰性求值

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

我有点不明白为什么在 R 中,下面的两个函数functionGen1functionGen2表现不同。这两个函数都试图返回另一个函数,该函数只是打印作为参数传递给函数生成器的数字。

在第一个实例中,生成的函数失败为 a不再存在于全局环境中,但我不明白为什么需要它。我原以为它是作为参数传递的,并被替换为 aNumber在生成器函数和打印函数的命名空间中。

我的问题是:为什么列表中的函数list.of.functions1不再工作时 a是不是在全局环境中定义的? (为什么这适用于 list.of.functions2 甚至 list.of.functions1b 的情况)?

functionGen1 <- function(aNumber) {
printNumber <- function() {
print(aNumber)
}
return(printNumber)
}

functionGen2 <- function(aNumber) {
thisNumber <- aNumber
printNumber <- function() {
print(thisNumber)
}
return(printNumber)
}

list.of.functions1 <- list.of.functions2 <- list()
for (a in 1:2) {
list.of.functions1[[a]] <- functionGen1(a)
list.of.functions2[[a]] <- functionGen2(a)
}

rm(a)

# Throws an error "Error in print(aNumber) : object 'a' not found"
list.of.functions1[[1]]()

# Prints 1
list.of.functions2[[1]]()
# Prints 2
list.of.functions2[[2]]()

# However this produces a list of functions which work
list.of.functions1b <- lapply(c(1:2), functionGen1)

最佳答案

一个更小的例子:

functionGen1 <- function(aNumber) {
printNumber <- function() {
print(aNumber)
}
return(printNumber)
}

a <- 1
myfun <- functionGen1(a)
rm(a)
myfun()
#Error in print(aNumber) : object 'a' not found

您的问题不是关于命名空间(这是一个与包相关的概念),而是关于变量范围和惰性求值。

惰性求值意味着函数参数仅在需要时才求值。直到您调用 myfun没有必要评估 aNumber = a .但由于 a已被删除,此评估失败。

通常的解决方案是像处理 functionGen2 一样强制执行明确的评估。或者,例如,
functionGen1 <- function(aNumber) {
force(aNumber)
printNumber <- function() {
print(aNumber)
}
return(printNumber)
}

a <- 1
myfun <- functionGen1(a)
rm(a)
myfun()
#[1] 1

关于r - 理解 R 函数惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41361844/

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