gpt4 book ai didi

r - 在 for 循环中包含变量

转载 作者:行者123 更新时间:2023-12-05 01:02:35 25 4
gpt4 key购买 nike

因此,请考虑以下代码块,它不像大多数人所期望的那样工作

#cartoon example
a <- c(3,7,11)
f <- list()

#manual initialization
f[[1]]<-function(x) a[1]+x
f[[2]]<-function(x) a[2]+x
f[[3]]<-function(x) a[3]+x

#desired result for the rest of the examples
f[[1]](1)
# [1] 4
f[[3]](1)
# [1] 12

#attempted automation
for(i in 1:3) {
f[[i]] <- function(x) a[i]+x
}

f[[1]](1)
# [1] 12
f[[3]](1)
# [1] 12

请注意,在我们尝试“自动化”之后,我们两次都得到 12。当然,问题在于 i没有被封闭在函数的私有(private)环境中。所有功能引用同一个 i在全局环境中(只能有一个值),因为 for 循环似乎不会为每次迭代创建不同的环境。
sapply(f, environment)
# [[1]]
# <environment: R_GlobalEnv>
# [[2]]
# <environment: R_GlobalEnv>
# [[3]]
# <environment: R_GlobalEnv>

所以我虽然可以使用 local()force()捕获 i值(value)
for(i in 1:3) {
f[[i]] <- local({force(i); function(x) a[i]+x})
}

f[[1]](1)
# [1] 12
f[[3]](1)
# [1] 12

但这仍然行不通。我可以看到它们都有不同的环境(通过 sapply(f, environment) )但是它们似乎是空的( ls.str(envir=environment(f[[1]])) )。将此与
for(i in 1:3) {
f[[i]] <- local({ai<-i; function(x) a[ai]+x})
}

f[[1]](1)
# [1] 4
f[[3]](1)
# [1] 12

ls.str(envir=environment(f[[1]]))
# ai : int 1
ls.str(envir=environment(f[[3]]))
# ai : int 3

很明显 force()没有像我预期的那样工作。我假设它会捕获 i 的当前值进入当前环境。它在以下情况下很有用
#bad
f <- lapply(1:3, function(i) function(x) a[i]+x)
#good
f <- lapply(1:3, function(i) {force(i); function(x) a[i]+x})

在哪里 i作为参数/ promise 传递,但这一定不是 for 循环中发生的事情。

所以我的问题是:是否可以在没有 local() 的情况下创建此函数列表?和变量重命名?有没有比 force() 更合适的功能?这会将变量的值从父框架捕获到本地/当前环境中?

最佳答案

这不是一个完整的答案,部分原因是我不确定问题到底是什么(尽管我发现它很有趣!)。

相反,我将只提供两个替代方案 for - 有效的循环。他们帮助澄清了我心中的问题(特别是帮助我第一次理解为什么 force() 在调用 lapply() 时会做任何事情)。我希望他们也能帮助你。

首先,这是一个更接近于您的正确功能 lapply()调用,其工作原理与它相同:

a <- c(3,7,11)
f <- list()

## `for` loop equivalent of:
## f <- lapply(1:3, function(i) {force(i); function(x) a[i]+x})
for(i in 1:3) {
f[[i]] <- {X <- function(i) {force(i); function(x) a[i]+x}; X(i)}
}
f[[1]](1)
# [1] 4

其次,这里有一个使用 local()但不(严格意义上或字面意义上的)重命名 i .但是,它确实通过将其副本添加到本地环境来“重新调整”它。从某种意义上说,它与您的功能 for 只是微不足道的不同。 -loop,但将注意力集中在 i的范围,而不是它的名称,我认为它有助于阐明您问题背后的真正问题。
a <- c(3,7,11)
f <- list()

for(i in 1:3) {
f[[i]] <- local({i<-i; function(x) a[i]+x})
}
f[[1]](1)
# [1] 4

关于r - 在 for 循环中包含变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26064649/

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