【发布时间】:2017-08-25 21:42:55
【问题描述】:
我正在寻找一种方法来调用不受.GlobalEnv 中其他对象影响的函数。
看看下面的两个函数:
y = 3
f1 = function(x) x+y
f2 = function(x) {
library(dplyr)
x %>%
mutate(area = Sepal.Length *Sepal.Width) %>%
head()
}
在这种情况下:
-
f1(5)应该会失败,因为y没有在函数范围内定义 -
f2(iris)应该通过,因为该函数不会引用其范围之外的变量
现在,我可以将f1 和f2 的环境覆盖为baseenv() 或new.env(parent=environment(2L)):
environment(f1) = baseenv()
environment(f2) = baseenv()
f1(3) # fails, as it should
f2(iris) # fails, because %>% is not in function env
或:
# detaching here makes `dplyr` inaccessible for `f2`
# not detaching leaves `head` inaccessible for `f2`
detach("package:dplyr", unload=TRUE)
environment(f1) = new.env(parent=as.environment(2L))
environment(f2) = new.env(parent=as.environment(2L))
f1(3) # fails, as it should
f2(iris) # fails, because %>% is not in function env
有没有办法覆盖函数的环境,使其必须自给自足,但只要它加载自己的库,它也始终可以工作?
【问题讨论】:
-
只要是什么?
-
老实说,我根本不会编写包含全局变量的函数——这似乎是导致意外错误的秘诀。
-
@be_green 我有 99.9% 的把握相信迈克尔不仅知道这一点,而且非常同意这一点。我不知道问题的上下文,但我想这与在library that performs cross-machine communication 中隔离自包含用户代码有关。
-
@be_green 问题是特别注意全局变量的使用
标签: r scoping environments