Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使R函数返回一个锁定/不可变列表_R_Immutability - Fatal编程技术网

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