Как R знает, использовать функцию, если имя этой функции было переназначено на значение?
Я знаю, что хорошая практика не использовать имена из глобального пространства имен при именовании переменных, но что происходит, когда вы делаете это случайно?
Я думал, что потеряю предыдущий объект, но у R, похоже, есть подделка под капотом:
print(sd)
#> function (x, na.rm = FALSE)
#> sqrt(var(if (is.vector(x) || is.factor(x)) x else as.double(x),
#> na.rm = na.rm))
#> <bytecode: 0x0000000017e687b8>
#> <environment: namespace:stats>
sd <- 12.2
print(sd)
#> [1] 12.2
sd(1:10)
#> [1] 3.02765
Итак, теперь R знает, что в глобальном пространстве имен есть как двойной двойной вектор с именем sd
, так и функция статистики sd()
?
Или когда я звоню sd(1:10)
, интерпретатор автоматически расширяет его до sd.default()
? Но как R знает, чтобы искать метод по умолчанию на sd
, поскольку он теперь является вектором? Таким образом, функции и переменные, хранящиеся в разных местах в памяти, могут ссылаться на одно и то же имя?
obviously_a_user_defined_variable <- 257
obviously_a_user_defined_variable(1:10)
#> Error in obviously_a_user_defined_variable(1:10): could not find
# function "obviously_a_user_defined_variable"
Ответы
Ответ 1
R имеет отдельные пространства имен для функций и переменных. В зависимости от контекста, в котором происходит имя, R будет искать имя в одном пространстве имен или в другом.
Например, выражение sd(1:10)
является вызовом, а первым элементом в вызове должно быть имя функции. Поэтому в этом случае R будет искать функцию с именем sd
.
С другой стороны, выражение sd
не является вызовом, а именем, которое может быть либо именем переменной, либо именем функции. В этом случае R сначала будет искать первый объект в пути поиска с именем sd
, независимо от того, является ли он функцией или другим типом объекта.
Ответ 2
sd
принадлежит в среде stats
не в globalenv
. Вызов sd()
R ищет функцию sd
. Он не находится в globalenv
, поэтому он просматривает другие среды, пока не найдет функцию sd
Это называется лексическим охватом и объясняется в книгах Хэдли http://adv-r.had.co.nz/. Вероятно, в этой главе http://adv-r.had.co.nz/Environments.html или этот http://adv-r.had.co.nz/Functions.html