R语言:同名非函数变量为何不覆盖同名内置函数?
R中同名变量与函数的共存逻辑问题
当在R中定义与内置函数同名的非函数类型变量时,并不会影响同名内置函数的调用;但如果定义同名的自定义函数,则会覆盖内置函数的调用优先级。以下是具体的会话示例:
示例1:非函数类型变量不影响内置函数调用
R version 4.1.3 (2022-03-10) -- "One Push-Up" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) > typeof(c) [1] "builtin" > typeof(print) [1] "closure" > c <- 42 > print <- 'hello world' > typeof(c) [1] "double" > typeof(print) [1] "character" > print(c(print, c)) [1] "hello world" "42"
这里我们将c赋值为数值、print赋值为字符串,但调用c(print, c)和print(...)时,依然能正常调用内置的c()和print()函数。
示例2:自定义函数会覆盖内置函数调用
> c <- function(x, ...) paste('Hello', x, ...) > c(1,2,3) [1] "Hello 1 2 3" > base::c(1,2,3) [1] 1 2 3 > c <- "Gibberish" > c(1,2,3) [1] 1 2 3
当把c定义为自定义函数后,调用c(1,2,3)会执行这个自定义函数;而当把c重新赋值为字符串后,调用c(1,2,3)又恢复使用内置的c()函数。
原因解析
这是R的名字查找规则针对函数调用场景做的特殊处理:
- 当使用
函数名(参数)这种函数调用语法时,R会优先在当前环境中查找函数类型的对象。如果当前环境中存在同名的非函数对象(比如数值、字符串),R会直接跳过它,继续向上层环境(比如base包所在的环境)查找同名的函数。 - 只有当当前环境中存在同名的函数类型对象时,R才会使用这个本地函数,不再向上查找内置函数。
- 一旦把本地的同名对象重新赋值为非函数类型,函数调用时又会回到上层环境找内置函数。
内容的提问来源于stack exchange,提问作者vitalizzare
相关产品推荐
相关产品推荐

