Wie schalte ich den Funktionsnamenabschluss ein?
Frage
Beim Golfen versucht man, ein Puzzle in so wenigen Zeichen wie möglich zu vervollständigen und im Allgemeinen nur die Basissprache zu verwenden. Einer Trick Für Golf in R soll die teilweise Fertigstellung so verwendet werden, dass z. rle(...)$length
kann verkürzt werden auf rle(...)$l
. Wie aktiviert man den Funktionsnamenabschluss in R, vorzugsweise in so wenigen Zeichen wie möglich?
Lösung
`?` <- 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
}
Dies überlastet den Help -Operator, um das kürzeste Objekt bereitzustellen, das dem regulären Ausdruck entspricht. Zum Beispiel:
> ?as.ch
function (x, ...) .Primitive("as.character")
> a<-1
> ?as.ch(a)
[1] "1"
Andere Tipps
Inspiriert von @ian ist hier eine Golfversion von @Ians Antwort. Das Konzept ist ähnlich, aber verwenden Sie einen R-ish-Hack (dh Tree Manipulation)
`?`<-function(o)with(x<-as.list(substitute(o)),do.call(apropos(paste("^",deparse(x[[1]]),sep=""))[1],x[-1]))
Versuchen:
> ?me(1:5)
[1] 3
> a<-1;?as.ch(a)
[1] "1"
>
für Golf, R
braucht eine Abkürzung von function
.