我们知道在使用 R 的过程中,当我们访问列表、数据框等对象时,在对象后键入美元符号 $
会弹出关于自动补全的提示,这在 RStduio 中编写代码时非常方便好用,那么它是如何实现的呢?
首先,这跟 RStduio 无关,因为如果你在终端中使用 R 的话,键入美元符号后再使用 <Tab>
键,也是会有自动提示的。所以,R 本身通过某种实现完成了这一提示。
这里我们利用网上的一个简单例子来了解这一过程。
# Define class
setClass("customList",
representation("list")
)
# Make example
tmp <- new("customList",
list(
test='a',
b=1:3
)
)
tmp
上面创建了一个简单的类和相应的实例 tmp
。
> tmp
An object of class "customList"
[[1]]
[1] "a"
[[2]]
[1] 1 2 3
当我们键入 tmp$
后,编辑器很智能地弹出了自动补全提示:
image
实际上在这一过程中,R 调用了一个默认的隐藏泛型函数 .DollarNames()
。
image-1673428611201
现在我们构造了一个新的类,那么添加新的匹配方法是可以更改自动补全的。
.DollarNames.customList <- function(x, pattern="") {
grep(pattern, names(x), value=TRUE)[1]
}
运行完上面的代码后,我们再来看补全,它就变成了只返回第一个元素的名字:
image-1673432084352
了解了这个之后,我们就算要魔改也是 okay 的!
试着改不存在的名称:
.DollarNames.customList <- function(x, pattern="") {
c("a", "b", "c")
}
image-1673432170893
R 就是这么任性啊。