2011-12-02 37 views
2

在打高爾夫球的過程中,人們試圖用盡可能少的字符來完成拼圖,通常只使用基本語言。在R中用於打高爾夫球的一個trick是使用部分完成,例如, rle(...)$length可以縮短爲rle(...)$l。在R中如何打開函數名完成,最好是儘可能少的字符?如何打開函數名稱完成?

+0

是不是有goruby? – ninjalj

回答

8
`?` <- 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" 
+5

好極了,現在所需要的只是將其移入核心R,以便我們可以編碼高爾夫,而無需像上面那樣定義函數'?'。不應該很難,因爲高爾夫比幫助重要得多;-) – Tommy

+6

我們應該開始一個名爲「g」的代碼高爾夫球庫。 –

4

受@Ian的啓發,這是@ Ian的答案的高爾夫版本。 的概念是類似的,但使用一些R-ISH黑客(即調用樹的操作)

`?`<-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的快捷方式。