【发布时间】:2018-05-03 02:03:36
【问题描述】:
我知道在命名变量时最好不要使用全局命名空间中的名称,但是如果你不小心这样做了会发生什么?
我以为我会丢失之前的对象,但 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"
【问题讨论】:
-
简单回答:
sd(1:10)是对函数sd的调用。因此,R 会查找一个名为sd()的函数,它可以在预加载的 stats 包中找到。 -
您要使用的术语(和标记)是 'shadowing',如“同名变量正在对函数进行阴影处理”。严格来说,函数的名称没有被“重新分配”。