Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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 - Fatal编程技术网

R 限制哪些函数可以修改对象

R 限制哪些函数可以修改对象,r,R,我的全局环境中有一个变量,名为myList。我有一个函数,可以修改myList,并将其重新分配给名为myFunction的全局环境。我只希望myList被myFunction修改。是否有方法防止任何其他函数修改myList 作为背景,我正在为R用户构建一个通用工具。我不希望该工具的用户能够定义自己的函数来修改myList。我也不希望自己能够用将来可能编写的函数修改myList 我有一个潜在的解决方案,但我不喜欢。执行该工具时,我可以检查用户定义的每个函数的文本,并搜索将分配给全局环境的myLis

我的全局环境中有一个变量,名为
myList
。我有一个函数,可以修改
myList
,并将其重新分配给名为
myFunction
的全局环境。我只希望
myList
myFunction
修改。是否有方法防止任何其他函数修改myList

作为背景,我正在为R用户构建一个通用工具。我不希望该工具的用户能够定义自己的函数来修改
myList
。我也不希望自己能够用将来可能编写的函数修改
myList

我有一个潜在的解决方案,但我不喜欢。执行该工具时,我可以检查用户定义的每个函数的文本,并搜索将分配给全局环境的
myList
文本。我不喜欢我需要搜索所有函数的事实

有人知道我所寻找的东西是否可以在R中实现吗?感谢您提供的任何帮助

对于可复制的示例。我需要使以下示例成为可能的代码:

assign('myList', list(), envir = globalenv())
myFunction <- function() {
    myList <- c(myList, 'test')
    assign('myList', myList, envir = globalenv())
}
userFunction <- function() {
    myList <- c(myList, 'test')
    assign('myList', myList, envir = globalenv())
}
myFunction() # I need some code that will allow this function to run successfully
userFunction() # and cause an error when this function runs
assign('myList',list(),envir=globalenv())
myFunction听起来你需要这个软件包

基本上,每个代码单元都有自己的范围

e、 g

运行此功能,我们现在可以获得:

userFunction()
# Error in userFunction() : object '.myList' not found
如所愿

有关更多详细示例,请参见

另一种方法是,您可以定义一个环境(
new.env()
),然后在加载
myList

后锁定它。听起来您需要这个包

基本上,每个代码单元都有自己的范围

e、 g

运行此功能,我们现在可以获得:

userFunction()
# Error in userFunction() : object '.myList' not found
如所愿

有关更多详细示例,请参见


另一种选择是,您可以定义一个环境(
new.env()
),然后在加载
myList
后锁定它。这完全是个坏主意。从分配到全局环境(我从未使用过这样的包)开始,让您的用户感到惊讶。您可能应该只使用S4或引用类

无论如何,您可以锁定绑定(如果遵循更好的实践,也可以锁定环境)。你不会用它来阻止高级用户,但他们至少知道你不想让他们更改对象

createLocked <- function(x, name, env) {
  assign(name, x, envir = env)
  lockBinding(name, env)
  invisible(NULL)
}

createLocked(list(), "myList", globalenv())


myFunction <- function() {
  unlockBinding("myList", globalenv())
  myList <- c(myList, 'test')
  assign('myList', myList, envir = globalenv())
  lockBinding("myList", globalenv())
  invisible(NULL)
}

userFunction <- function() {
  myList <- c(myList, 'test')
  assign('myList', myList, envir = globalenv())
}

myFunction() # runs successfully
userFunction() 
#Error in assign("myList", myList, envir = globalenv()) : 
#  cannot change value of locked binding for 'myList'

createLocked这完全是个坏主意。从分配到全局环境(我从未使用过这样的包)开始,让您的用户感到惊讶。您可能应该只使用S4或引用类

无论如何,您可以锁定绑定(如果遵循更好的实践,也可以锁定环境)。你不会用它来阻止高级用户,但他们至少知道你不想让他们更改对象

createLocked <- function(x, name, env) {
  assign(name, x, envir = env)
  lockBinding(name, env)
  invisible(NULL)
}

createLocked(list(), "myList", globalenv())


myFunction <- function() {
  unlockBinding("myList", globalenv())
  myList <- c(myList, 'test')
  assign('myList', myList, envir = globalenv())
  lockBinding("myList", globalenv())
  invisible(NULL)
}

userFunction <- function() {
  myList <- c(myList, 'test')
  assign('myList', myList, envir = globalenv())
}

myFunction() # runs successfully
userFunction() 
#Error in assign("myList", myList, envir = globalenv()) : 
#  cannot change value of locked binding for 'myList'

createLocked我不认为有什么限制——你应该看看S3类,也许最好的解决方案是拥有你自己的数据结构和该类特有的方法。因为您的数据不是由函数创建的,而是经过修改的-初始输入将始终可以自由执行任何操作。我认为不应该有如此严格的限制-您应该查看S3类,也许最好的解决方案是几乎拥有您自己的数据结构和该类特有的方法。因为您的数据不是由函数创建的,而是经过修改的-初始输入将始终可以自由执行任何操作。