如果函数名称已被重新分配给一个值,R 如何知道要使用该函数?
How does R know to use a function, if that functions name has been reassigned to a value?
我知道在命名变量时最好不要使用全局命名空间中的名称,但是如果不小心这样做会怎样?
我以为我会丢失之前的对象,但 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 知道在全局命名空间中既有长度为 1 的双精度向量 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
属于 stats
环境,不属于 globalenv
。调用 sd()
R 查找函数 sd
。它不在 globalenv
中,因此它会查看其他环境,直到找到函数 sd
这称为词法作用域,在 Hadley 的书中有解释 http://adv-r.had.co.nz/. Likely in this chapter http://adv-r.had.co.nz/Environments.html or this one http://adv-r.had.co.nz/Functions.html
R 有 separate namespaces for functions and variables。根据名称出现的上下文,R 将在一个名称空间或另一个名称空间中查找名称。
例如,表达式 sd(1:10)
是一个调用,调用中的第一个元素必须是一个函数的名称。因此,在这种情况下,R 将查找名为 sd
.
的函数
另一方面,表达式sd
不是一个调用,而是一个名字,它可以是一个变量的名字,也可以是一个函数的名字。在这种情况下,R 将首先查找名为 sd
的搜索路径中的第一个对象,而不管它是函数还是其他类型的对象。
我知道在命名变量时最好不要使用全局命名空间中的名称,但是如果不小心这样做会怎样?
我以为我会丢失之前的对象,但 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 知道在全局命名空间中既有长度为 1 的双精度向量 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
属于 stats
环境,不属于 globalenv
。调用 sd()
R 查找函数 sd
。它不在 globalenv
中,因此它会查看其他环境,直到找到函数 sd
这称为词法作用域,在 Hadley 的书中有解释 http://adv-r.had.co.nz/. Likely in this chapter http://adv-r.had.co.nz/Environments.html or this one http://adv-r.had.co.nz/Functions.html
R 有 separate namespaces for functions and variables。根据名称出现的上下文,R 将在一个名称空间或另一个名称空间中查找名称。
例如,表达式 sd(1:10)
是一个调用,调用中的第一个元素必须是一个函数的名称。因此,在这种情况下,R 将查找名为 sd
.
另一方面,表达式sd
不是一个调用,而是一个名字,它可以是一个变量的名字,也可以是一个函数的名字。在这种情况下,R 将首先查找名为 sd
的搜索路径中的第一个对象,而不管它是函数还是其他类型的对象。