使R函数返回一个锁定/不可变列表
我有一个返回列表的函数。 我希望这个列表是不可变的,类似于锁绑定防止覆盖或编辑对象的方式 这将类似于以下内容:使R函数返回一个锁定/不可变列表,r,immutability,R,Immutability,我有一个返回列表的函数。 我希望这个列表是不可变的,类似于锁绑定防止覆盖或编辑对象的方式 这将类似于以下内容: 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 Err
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:
用户应该能够以类似于当前美元符号访问的简单方式访问子项/元素
mylist$a$b$c
[1] 3
不能编辑此对象
mylist$a <- 5
Error:
所以我的问题是,R中有什么可用的选项来实现这一点?实现这一点的一种方法是创建一个新类(
锁定的
)以及的方法[这本身是一个合理的问题,但出于您的目的,您是否考虑过返回一个可以返回列表元素而不是列表本身的函数?@Hugh这是一个合理的建议。在这种情况下,我希望用户能够以熟悉的方式使用对象,同时仍然能够浏览其结构。
mylist$a <- 5
Error:
rm(mylist)
mylist
Error: object 'mylist' not found
`[[<-.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"
class(out)<-c("locked",class(out))