Как включить завершение имени функции? - PullRequest
2 голосов
/ 03 декабря 2011

В гольфе, каждый пытается завершить загадку как можно меньшим количеством символов, обычно используя только базовый язык.Один трюк для игры в гольф в R состоит в том, чтобы использовать частичное завершение, чтобы, например, rle(...)$length можно было сократить до rle(...)$l.Как включить завершение имени функции в R, желательно как можно меньше символов?

Ответы [ 2 ]

9 голосов
/ 03 декабря 2011
`?` <- 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"
4 голосов
/ 03 декабря 2011

Вдохновленный @Ian, вот вариант ответа @ Ian для гольфа.Концепция аналогична, но используйте некоторый хак R-ish (т. Е. Манипулирование деревом вызовов)

`?`<-function(o)with(x<-as.list(substitute(o)),do.call(apropos(paste("^",deparse(x[[1]]),sep=""))[1],x[-1]))

try:

> ?me(1:5)
[1] 3
> a<-1;?as.ch(a)
[1] "1"
> 

для гольфа, R нужен ярлык function.

...