【发布时间】:2011-12-02 23:18:37
【问题描述】:
在打高尔夫球时,人们会尝试用尽可能少的字符来完成拼图,通常只使用基本语言。在 R 中打高尔夫球的一个trick 是使用部分完成,例如rle(...)$length 可以缩写为 rle(...)$l。如何在 R 中打开函数名称补全,最好用尽可能少的字符?
【问题讨论】:
在打高尔夫球时,人们会尝试用尽可能少的字符来完成拼图,通常只使用基本语言。在 R 中打高尔夫球的一个trick 是使用部分完成,例如rle(...)$length 可以缩写为 rle(...)$l。如何在 R 中打开函数名称补全,最好用尽可能少的字符?
【问题讨论】:
`?` <- function(object){
object <- deparse(substitute(object))
splt <- strsplit(object,"(",fixed=TRUE)[[1]]
object <- splt[1]
if(length(splt)>1)
func <- paste("(",splt[2],collapse="")
else
func <- ""
envs <- sapply(search(),as.environment)
objs <- do.call("c",lapply(envs,function(x) ls(envir=x,all.names=TRUE)))
matches <- objs[grep(object,objs)]
objectMatch <- matches[which.min(nchar(matches))][1]
res <- eval(parse(text=paste(objectMatch,func,collapse="")), envir = parent.frame())
res
}
这会重载帮助运算符以提供与所提供的正则表达式匹配的最短对象。例如:
> ?as.ch
function (x, ...) .Primitive("as.character")
> a<-1
> ?as.ch(a)
[1] "1"
【讨论】:
?。应该不难,因为打高尔夫球比帮助重要得多;-)
受@Ian 启发,这是@Ian 答案的高尔夫版本。 概念类似,但使用了一些 R-ish hack(即调用树操作)
`?`<-function(o)with(x<-as.list(substitute(o)),do.call(apropos(paste("^",deparse(x[[1]]),sep=""))[1],x[-1]))
尝试:
> ?me(1:5)
[1] 3
> a<-1;?as.ch(a)
[1] "1"
>
对于高尔夫,R 需要function 的快捷方式。
【讨论】: