gpt4 book ai didi

r - 使 R 函数返回锁定/不可变列表

转载 作者:行者123 更新时间:2023-12-04 11:01:24 26 4
gpt4 key购买 nike

我有一个返回列表的函数。
我希望这个列表是不可变的,类似于 lockBinding 防止覆盖或编辑对象的方式。

这将类似于以下内容:

myfun <- function(x){
out <- list(a = 1, val = x)
make_read_only(out)
out
}
test <- myfun(9)
test$a
[1] 1

test$val
[1] 9

test
$a
[1] 1

$val
[1] 9

test$newval <- 7
Error:

哪里 make_read_only()只是完成此任务的函数或某些代码的替代品。

我曾尝试使用可以完美工作的 lockBinding,但是在函数返回其输出后,“锁”无法向上传递到父环境中。
我还研究了尝试在父环境中锁定符号,但似乎没有办法从函数内部了解输出将分配给什么,这需要作为 lockBinding 的参数。

似乎有一种方法可以通过返回对环境的引用并使用 lockEnvironment() 锁定环境或做类似的事情来做到这一点,但我想在开始之前听听有哪些选项可以实现这一点。
类似地,使用 R6 似乎可以实现,但我更愿意避免使用 R6,因为此代码库的任何其他部分都不需要它,同样,我只想听听有哪些选项可以实现这种行为。

总之,该函数将返回一个任意列表。此列表将至少有几层深。
mylist <- myfun(list(b = list(c = 3), foo = "bar"))

用户应该能够以类似于当前美元符号访问的直接方式访问 sublits/元素
mylist$a$b$c
[1] 3

应该无法编辑此对象。
mylist$a <- 5
Error:

应该可以通过以下方式移除对象
rm(mylist)
mylist
Error: object 'mylist' not found

所以我的问题是,R 中有哪些可用选项可以实现这一点?

最佳答案

实现这一点的一种方法是创建一个新类( locked )以及 [<- 的方法。 , [[<- , 和 $<-对于这个新类,它将返回一个错误。

例如:

`[[<-.locked` <- function(...) {stop("Can't assign into locked object")}
a<-list(a="a",b=2)
a
$a
[1] "a"

$b
[1] 2

class(a)<-"locked"
a[[1]]<-"moose"
Error in `[[<-.locked`(`*tmp*`, 1, value = "moose") :
Can't assign into locked object

a
$a
[1] "a"

$b
[1] 2

attr(,"class")
[1] "locked"

在这种情况下,所有“只读”函数需要做的就是将对象的类重新定义为 locked :
class(out)<-c("locked",class(out))

关于r - 使 R 函数返回锁定/不可变列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58776481/

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