Come si attiva il completamento del nome della funzione?
Domanda
Nel golf, si cerca di completare un puzzle nel minor numero possibile di caratteri, in generale usando solo il linguaggio di base. Uno trucco Per il golf in R è utilizzare il completamento parziale in modo che EG rle(...)$length
può essere abbreviato a rle(...)$l
. Come si accende il completamento del nome della funzione in R, preferibilmente nel minor numero possibile di caratteri?
Soluzione
`?` <- 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
}
Ciò sovraccarica l'operatore di aiuto per fornire l'oggetto più breve corrispondente all'espressione regolare fornita. Per esempio:
> ?as.ch
function (x, ...) .Primitive("as.character")
> a<-1
> ?as.ch(a)
[1] "1"
Altri suggerimenti
Ispirato da @ian, ecco una versione da golf della risposta di @Ian. Il concetto è simile ma usa un po 'di hack R-ish (cioè la manipolazione degli alberi)
`?`<-function(o)with(x<-as.list(substitute(o)),do.call(apropos(paste("^",deparse(x[[1]]),sep=""))[1],x[-1]))
Tentativo:
> ?me(1:5)
[1] 3
> a<-1;?as.ch(a)
[1] "1"
>
per il golf, R
ha bisogno di un collegamento di function
.