a$set("foo", 1) > a$get("foo") [1] 1 很酷,是吧?请注意,parent=emptye-6ren">
gpt4 book ai didi

R:从函数内部在 globalenv() 中创建环境

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

现在我有以下几行:

envCache <- new.env( hash=TRUE, parent = .GlobalEnv )
print(parent.env(envCache))

R 声称环境位于全局环境中,但是当我稍后尝试查找环境时,它不在那里。

我在这里尝试做的是将一些数据帧缓存在全局环境下的环境中,因此每次调用函数时,它不必再次访问服务器来获取相同的数据。理想情况下,我将在 R 控制台中使用源命令调用该函数一次,它将获取必要的数据,将其保存到全局环境中的环境中,然后当我从 R 控制台调用相同的函数时,它将看到它将从中获取数据的环境和数据帧,而不是重新查询服务器。

最佳答案

当 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() 返回两个函数的列表:getset

a <- makeCache() 

每个函数都有一个定义它的环境(调用 makeCache() 时创建的环境)。当您调用 a$set("a", 1) 时,变量查找规则意味着 R 首先在函数 内部查找变量 cache aCache$set,以及当它在定义 set 的环境中找不到它时。

> a$get("foo")
NULL
> a$set("foo", 1)
> a$get("foo")
[1] 1

很酷,是吧?请注意,parent=emptyenv()) 意味着对不存在的键的 get() 会停止在缓存中查找,否则将会有继续在cache的父环境中查找,等等。

有一个bank account example R 简介文档中的内容非常有趣。为了响应 @sunpyg 的评论,我添加了 loadls 函数来添加 Rda 文件中的数据并列出缓存的内容,例如 a$load("foo.Rda").

关于R:从函数内部在 globalenv() 中创建环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375790/

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