我正在寻找一种方法来调用不受.GlobalEnv
中其他对象影响的函数。强制R函数调用是自给自足的
采取下面来看看两个功能:
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
有没有办法来覆盖功能的环境,使其具有自给自足,但只要加载自己的库,它也总是有效的?
只要是什么? –
老实说,我只是不会编写包含全局变量的函数 - 它似乎是一个意外错误的处方。 –
可能相关:https://stackoverflow.com/q/6216968/324364 – joran