R 限制变量范围

R 限制变量范围,r,scope,R,Scope,我试图写一个函数,它限制了R变量的范围。比如说, source("LimitScope.R") y = 0 f = function(){ #Raises an error as y is a global variable x = y } 我曾想过测试可变环境,但并不确定如何做到这一点 为什么 我教大学毕业生。在他们的前几次实践中,他们中的一些人总是忘记变量作用域,所以他们提交的函数不起作用。例如,我总是得到这样的结果: n = 10 f = function(x){ #Ra

我试图写一个函数,它限制了R变量的范围。比如说,

source("LimitScope.R")
y = 0
f = function(){
   #Raises an error as y is a global variable
   x = y
}
我曾想过测试可变环境,但并不确定如何做到这一点

为什么

我教大学毕业生。在他们的前几次实践中,他们中的一些人总是忘记变量作用域,所以他们提交的函数不起作用。例如,我总是得到这样的结果:

n = 10
f = function(x){
  #Raises an error
  #as I just source f and test it for a few test cases.
  return(x*n)
}

我想要的是一个可以“关闭”范围的快速功能。正如您可以想象的那样,它不必特别健壮,因为它只适用于少数几个实用程序。

我不确定您是否希望这样做,但是
local()
函数和
codetools
库应该会有所帮助

在你的例子中,试试看

f = local( function() { ... }, baseenv())

它不完全是你想要的,但它应该让你更接近

您可以使用
exists('y',envir=.GlobalEnv)检查全局环境中是否存在y
您可以使用此函数强制变量为本地版本:

get_local <- function(variable)
{
  get(variable, envir = parent.frame(), inherits = FALSE)  
}

编辑:“如何在不改变函数内容的情况下关闭词法范围”这一更一般的观点更难解决。我相当肯定,范围规则在R中根深蒂固。另一种选择可能是使用S-Plus,因为它确实如此。

偶尔发生在我身上的事情是,我在ESS中有一个拆分屏幕,左边是R代码的文件缓冲区,右边是解释器。在调试缓冲区中正在处理的代码时,我可能在解释器中设置了一些值。然后,缓冲区中的代码可能意外引用了我在intepreter中设置的内容。除非我每次都在一个新的解释器中评估缓冲区,否则很难发现问题,而ESS默认情况下并不是这样工作的


如果这是您经常看到的问题,那么源代码中的rm(list=ls(envir=.GlobalEnv))可能会有所帮助,但这当然会产生其他问题,例如在调试时删除他们用来保持状态的任何内容等。

出于兴趣,为什么要这样做?我在答案中添加了一个部分,说明我为什么要这样做。另请参见
y <- 0    
f <- function()
{
  x <- y
}    
print(f())        # 0

y <- 0    
f <- function()
{
  y <- get_local("y")
  x <- y
}    
print(f())        # Error: 'y' not found
g  <- function(x, y = TRUE, z = c("foo", "bar"), ...) 0

formalArgs(g)
# [1] "x"   "y"   "z"   "..."

formals(g)
#$x
#
#
#$y
#[1] TRUE
#
#$z
#c("foo", "bar")
#
#$...