我显然不明白如何使用环境,所以也许有人可以帮助我。我想在sapply
中评估这些功能,因此他们使用k = 1
。
fList <- list(function(x) k + 3, function(x) k + 4)
k <- 3
t <- sapply(1:2,
function(x) {
f <- fList[[x]]
evalq(s <- f(1), list(k = 1))
evalq(s <<- f(1), list(k = 1))
s
})
t
答案 0 :(得分:2)
R中的函数使用词法范围。这意味着他们在定义的环境中查找变量值,而不是在运行它们的位置。但是,您可以更改功能的环境。这是可能的(不一定推荐)
fList <- list(function(x) k + 3, function(x) k + 4)
k <- 3
t <- sapply(1:2,
function(x) {
f <- fList[[x]]
env <- new.env(parent=baseenv())
env$k <- 1
environment(f) <- env
s<-f(1)
s <<- f(1)
s
})
t
# [1] 4 5
你也可以使用表达式而不是函数
eList <- expression( k + 3, k + 4)
k <- 3
t <- sapply(1:2,
function(x) {
e <- eList[[x]]
s <- eval(e, list(k = 1))
s <<- eval(e, list(k = 1))
s
})
t
但最好不要在函数中保留自由变量,并明确地将参数或环境传递给该函数。