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) 
    }
}