Это не совсем ответ, я просто не могу не показать, как вы можете явно объявить глобальные переменные.@Ben Bolker должен опубликовать свой комментарий в качестве ответа.
Чтобы не видеть глобальные переменные, вы можете использовать функцию "вверх" в одной среде - она сможет видеть все стандартные функции и тому подобное (mean
и т. д.), но не все, что вы помещаете в глобальную среду:
explicit.globals = function(f) {
name = deparse(substitute(f))
env = parent.frame()
enclos = parent.env(.GlobalEnv)
environment(f) = enclos
env[[name]] = f
}
Тогда получение глобала - это просто извлечение его из .GlobalEnv
:
global = function(n) {
name = deparse(substitute(n))
env = parent.frame()
env[[name]] = get(name, .GlobalEnv)
}
assign('global', global, env=baseenv())
И это будетиспользуется как
a = 2
b = 3
f = function() {
global(a)
a
b
}
explicit.globals(f)
И называется как
> f()
Error in f() : object 'b' not found
Лично я бы на это не пошел, но если вы привыкли к PHP, это может иметь смысл.