如何隔离一个功能

时间:2011-11-02 02:22:03

标签: r

如何确保在调用函数时不允许从全局环境中获取变量?

我想以下代码给我一个错误。原因是因为我可能输错了z(我想键入y)。

z <- 10
temp <- function(x,y) {
        y <- y + 2
        return(x+z)
}
> temp(2,1)
[1] 12

我猜测答案与环境有关,但我还没有理解这些。

有没有办法让我想要的行为默认(例如通过设置选项)?

3 个答案:

答案 0 :(得分:5)

environment(temp) = baseenv()

另请参阅http://cran.r-project.org/doc/manuals/R-lang.html#Scope-of-variables?environment

答案 1 :(得分:4)

> library(codetools)
> checkUsage(temp)
<anonymous>: no visible binding for global variable 'z'

该功能不会改变,因此无需在每次使用时进行检查。 findGlobals更通用,更隐蔽​​。像

这样的东西
Filter(Negate(is.null), eapply(.GlobalEnv, function(elt) {
    if (is.function(elt))
        findGlobals(elt)
}))

可以访问环境中的所有函数,但是如果有多个函数那么可能是时候考虑编写一个包(它并不难)。

答案 2 :(得分:1)

environment(fun) = parent.env(environment(fun))

(为了清晰起见,我使用'fun'代替你的函数名'temp')

这将从搜索路径中删除“工作空间”环境(.GlobalEnv)并保留其他所有内容(例如所有包)。