【问题标题】:How do I turn on function name completion?如何打开函数名称完成?
【发布时间】:2011-12-02 23:18:37
【问题描述】:

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

【问题讨论】:

    标签: r code-golf


    【解决方案1】:
    `?` <- 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"
    

    【讨论】:

    • 太好了,现在只需将它移到核心 R 中,这样我们就可以编写高尔夫代码,而无需像上面那样定义函数 ?。应该不难,因为打高尔夫球比帮助重要得多;-)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-14
      • 2022-09-26
      • 2014-06-11
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多