Sie müssen nur eine Änderung vornehmen, damit Ihr Beispiel funktioniert - definieren Sie Ihre Funktion neu, damit sie substitute()
um die gewünschten Werte im Rahmen von f()
:
f <- function(env,z) {
eval(substitute(x+z,list(z=z)), env)
}
Dies kann schnell unübersichtlich werden, zumal Sie sogar Zuweisungsanweisungen innerhalb von substitute()
(zum Beispiel, ersetzen Sie x+z
avec y <- x+z
(nicht dass dies hier völlig relevant wäre), aber diese Entscheidung kann vom Entwickler getroffen werden...
Außerdem können Sie Folgendes ersetzen list(z=z)
in dem obigen Substitutionsausdruck mit environment()
(z.B., substitute(x+z,environment())
), solange Sie keine widersprüchlichen Variablennamen zwischen denen haben, die an f()
und denjenigen, die sich in Ihrer Umgebung aufhalten, aber vielleicht wollen Sie es nicht zu weit treiben.
Editar: Hier sind zwei weitere Möglichkeiten, von denen die erste nur dazu dient, die Flexibilität bei der Manipulation von Umgebungen zu zeigen, und die zweite sinnvoller ist, um sie tatsächlich zu nutzen.
1) Ändern Sie die umschließende Umgebung von 'env' (aber ändern Sie sie wieder auf den ursprünglichen Wert, bevor Sie die Funktion beenden):
f <- function(env,z) {
e <- environment(env)
environment(env) <- environment()
output <- with(env,x+z)
environment(env) <- e
output
}
2) Erzwinge die Auswertung von 'z' in der aktuellen Umgebung der Funktion (mit environment()
), anstatt sie nach der Auswertung des Ausdrucks als freie Variable zu belassen, x+z
, in 'env'.
f <- function(env,z) {
with(environment(),with(env,x+z))
}
Je nach gewünschter Auflösungsreihenfolge können Sie im Falle widersprüchlicher Symbol-Wert-Zuordnungen - z. B. wenn Sie 'x' sowohl in Ihrer Funktionsumgebung als auch in der von Ihnen erstellten Umgebung 'y' definiert haben (welchen Wert von 'x' soll sie annehmen?) - den Funktionskörper stattdessen wie folgt definieren with(env,with(environment(),x+z))
.