如何打开功能名称?

时间:2011-12-02 23:18:38

标签: r code-golf

在打高尔夫球时,人们试图用尽可能少的角色完成拼图,通常只使用基本语言。用于在R中打高尔夫球的一个trick是使用部分完成的,例如rle(...)$length可以缩短为rle(...)$l。如何在R中打开函数名称,最好是尽可能少的字符?

2 个答案:

答案 0 :(得分:9)

`?` <- 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"

答案 1 :(得分:4)

受到@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的快捷方式。