Как 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