如果函数名称已被重新赋值为R,R如何知道使用函数?

hra*_*bel 13 r shadowing

我知道在命名变量时不使用全局命名空间中的名称是一种好习惯,但是当你意外地执行此操作时会发生什么?

我以为我会丢失之前的对象,但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
Run Code Online (Sandbox Code Playgroud)

所以现在R知道在全局命名空间中有一个长度为一个双向量调用sd和一个stats函数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"
Run Code Online (Sandbox Code Playgroud)

Ern*_*t A 12

R具有函数和变量的单独名称空间.根据名称出现的上下文,R将在一个名称空间或另一个名称空间中查找名称.

例如,表达式sd(1:10)是一个调用,调用中的第一个元素必须是函数的名称.因此,在这种情况下,R将查找名为的函数sd.

另一方面,表达式sd不是调用而是名称,可以是变量的名称或函数的名称.在这种情况下,R将首先查找搜索路径中的第一个对象sd,无论它是函数还是其他类型的对象.

  • 最后一部分并不完全正确; 没有括号,R在搜索路径中查找名为`sd`的第一件事,无论它是否是对象的函数,例如`mtcars < - function()'foo'; mtcars` (3认同)
  • 我认为这不完全正确,例如运行`a < - mean; a < - 5; a(1:10)`会给出错误,因为函数`a`已被变量覆盖.是的,当使用括号`a()`R将在搜索路径上查找名为`a`的函数并避免使用其他对象时,但我认为函数和变量没有单独的命名空间. (2认同)