Вам нужно сделать только одно изменение, чтобы ваш пример заработал - переопределите вашу функцию, чтобы использовать substitute(), чтобы «исправить» желаемые значения в рамках f():
f <- function(env,z) {
eval(substitute(x+z,list(z=z)), env)
}
Это может быстро стать непонятным, особенно если вы даже можете включить операторы присваивания в substitute() (например, заменить x+z на y <- x+z, но это не совсем актуально здесь), но этот выбор может быть сделан разработчиком ...
Кроме того, вы можете заменить list(z=z) в приведенном выше выражении подстановки на environment() (например, substitute(x+z,environment())), если у вас нет конфликтующих имен переменных между теми, которые переданы в f(), и теми, которые находятся в вашем 'env', но вы можете не захотеть принимать это слишком далеко.
Изменить: Вот два других способа, первый из которых предназначен только для демонстрации гибкости в управлении средой, а второй более разумно использовать.
1) измените окружающую среду env (но верните исходное значение перед выходом из функции):
f <- function(env,z) {
e <- environment(env)
environment(env) <- environment()
output <- with(env,x+z)
environment(env) <- e
output
}
2) Принудительное вычисление 'z' в текущем окружении функции (с использованием environment()) вместо того, чтобы позволить ему оставаться свободной переменной после вычисления выражения x+z в 'env'.
f <- function(env,z) {
with(environment(),with(env,x+z))
}
В зависимости от вашего желаемого порядка разрешения, в случае конфликтующих ассоциаций символ-значение - например, если у вас есть 'x', определенный как в вашей функциональной среде, так и в среде, которую вы создали, 'y' (какое значение 'x' вы хотите предположить?) - вместо этого вы можете определить тело функции как with(env,with(environment(),x+z)).
person
hatmatrix
schedule
16.04.2010
with? В противном случае вы можете использоватьenv$x+z. - person Marek   schedule 15.04.2010with. Но это хорошее решение, и я мог бы им воспользоваться. - person Eduardo Leoni   schedule 15.04.2010