Ich bin auf der Suche nach einer Möglichkeit, eine Funktion, die nicht von anderen Objekten in .GlobalEnv
beeinflusst wird.Force R Funktionsaufruf zu autarken
Werfen Sie einen Blick auf die beiden folgenden Funktionen:
y = 3
f1 = function(x) x+y
f2 = function(x) {
library(dplyr)
x %>%
mutate(area = Sepal.Length *Sepal.Width) %>%
head()
}
In diesem Fall:
f1(5)
ausfallen, weily
nichtf2(iris)
passieren sollte im Funktionsumfang definiert ist, weil die Funktion keine Variablen außerhalb ihres Gültigkeitsbereichs referenziert
, kann ich die Umgebung von f1
überschreiben und f2
, entweder zu baseenv()
oder 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
oder:
# 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
Gibt es eine Möglichkeit, eine Funktion die Umgebung zu überschreiben, so dass sie um autark zu sein, aber es funktioniert auch immer, solange es seine eigenen Bibliotheken lädt?
Solange es was ist? –
Ehrlich, ich würde einfach keine Funktionen schreiben, die globale Variablen enthalten - es scheint ein Rezept für unbeabsichtigte Fehler zu sein. –
Möglicherweise relevant: https://stackoverflow.com/q/6216968/324364 – joran