R:从函数内部在globalenv()中创建环境
现在我有台词:R:从函数内部在globalenv()中创建环境,r,R,现在我有台词: envCache <- new.env( hash=TRUE, parent = .GlobalEnv ) print(parent.env(envCache)) envCache当R查找符号时,它会在当前环境中查找,然后在环境的父环境中查找,依此类推。它尚未将envCache分配到全局环境中。实现您想要做的事情的一种方法是创建一个“闭包”,按照 makeCache <- function() { cache <- new.env(parent=emp
envCache <- new.env( hash=TRUE, parent = .GlobalEnv )
print(parent.env(envCache))
envCache当R查找符号时,它会在当前环境中查找,然后在环境的父环境中查找,依此类推。它尚未将envCache分配到全局环境中。实现您想要做的事情的一种方法是创建一个“闭包”,按照
makeCache <- function() {
cache <- new.env(parent=emptyenv())
list(get = function(key) cache[[key]],
set = function(key, value) cache[[key]] <- value,
## next two added in response to @sunpyg
load = function(rdaFile) load(rdaFile, cache),
ls = function() ls(cache))
}
每个函数都有一个定义它的环境(调用makeCache()
时创建的环境)。调用a$set(“a”,1)
变量查找规则意味着R首先在函数aCache$set
内查找变量cache
,在定义set
的环境中找不到变量
> a$get("foo")
NULL
> a$set("foo", 1)
> a$get("foo")
[1] 1
酷,嗯?请注意,parent=emptyenv())
意味着不存在的键上的get()
停止在缓存中查找,否则它将继续在缓存的父环境中查找,依此类推
在R简介文档中有一个非常有趣的地方。为了回应@sunpyg的评论,我添加了一个load
和ls
函数来添加Rda文件中的数据并列出缓存的内容,例如,a$load(“foo.Rda”)
以下是我作为替代解决方案想到的。它可能与后面的另一个答案做了相同的事情,但代码对我来说更直观
cacheTesting <- function()
{
if (exists("cache"))
{
print("IT WORKS!!!")
cacheData <- get("test", envir = cache)
print(cacheData)
}
else
{
assign("cache", new.env(hash = TRUE), envir = .GlobalEnv)
test <- 42
assign("test", test, envir = cache)
}
}
cacheTesting对于上述答案的工作原理仍然有点困惑,但在对R简介中的示例进行了一些调查和回顾之后,我提出了自己的解决方案。这确实很酷,但我如何直接将数据加载到该环境中呢<代码>加载(“foo.bin”,envir=cache)
仅在parent=.GlobalEnv
?@sunpyg在修改后的答案中查看a$load
。当然,当然……我从函数外部尝试过,但失败了。骗我!学到了一些东西…谢谢
cacheTesting <- function()
{
if (exists("cache"))
{
print("IT WORKS!!!")
cacheData <- get("test", envir = cache)
print(cacheData)
}
else
{
assign("cache", new.env(hash = TRUE), envir = .GlobalEnv)
test <- 42
assign("test", test, envir = cache)
}
}