Comment activer le nom de la fonction fin?
Question
Dans le golf, on essaie de compléter un casse-tête en moins de caractères possible, en utilisant généralement la langue de base uniquement. Un tour pour le golf dans R est d'utiliser un achèvement partiel de telle sorte que par exemple, rle(...)$length
peut être raccourci à rle(...)$l
. Comment un tour à la fin du nom de la fonction R, de préférence en moins de caractères possible?
La solution
`?` <- 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
}
Cette surcharge de l'opérateur d'aide pour fournir l'objet le plus court qui permet de rechercher fourni. Par exemple:
> ?as.ch
function (x, ...) .Primitive("as.character")
> a<-1
> ?as.ch(a)
[1] "1"
Autres conseils
Inspiré par @Ian, voici une version de golf @ réponse de Ian. Le concept est similaire, mais utilise une hack R-ish (à savoir la manipulation de l'arbre d'appel)
`?`<-function(o)with(x<-as.list(substitute(o)),do.call(apropos(paste("^",deparse(x[[1]]),sep=""))[1],x[-1]))
essayer:
> ?me(1:5)
[1] 3
> a<-1;?as.ch(a)
[1] "1"
>
pour le golf, R
a besoin d'un raccourci de function
.