我會做的是創建一個查找表,它將一個函數映射到它所在的.R
文件中。每次添加,刪除或移動某個函數時都必須重新創建此表,但我認爲這會更可取每當你想找到函數的源文件時重新生成表格。因此,這裏是我對建立這樣一個表:
library(plyr)
functionsFromRfile = function(filename) {
# Get all functions from a source file. Create new enviroment
# source the functions into them and use ls() to extract names.
e = new.env()
source(filename, local = e)
return(ls(envir = e))
}
# This assumes you are in the directory with your R code,
# and that all files need to be included. You can also
# make this list manually ofcourse
Rfiles = list.files(".", pattern = ".R")
# Get a list of functions for each .R file
lutFunc2sourcefile = ldply(Rfiles, function(x) {
return(data.frame(fname = x, func = functionsFromRfile(x)))
})
對於我自己的包之一,這導致:
> head(lutFunc2sourcefile)
fname func
1 autofitVariogram.r autofitVariogram
2 autoKrige.cv.r autoKrige.cv
3 autoKrige.cv.r checkIfautokrige.cv
4 autoKrige.cv.r compare.cv
5 autoKrige.cv.r cv.compare.bubble
6 autoKrige.cv.r cv.compare.ggplot
您可以使用查找表來使用所獲得的功能名稱進行映射從sys.call
。
編輯:鑑於您對非函數代碼的評論,此代碼使用parse,它不評估代碼。它搜索解析的輸出,並且除去函數,並且不應該評估任何代碼或返回不是函數的代碼。我沒有詳盡地測試過,請嘗試一下。
library(plyr)
Rfiles = list.files(".", pattern = "(.R|.r)")
lutFunc2sourcefile = ldply(Rfiles, function(fname) {
f = parse(fname)
functions = sapply(strsplit(as.character(f), "="), function(l) {
if(grepl("^function", sub(' ', '', l[2]))) {
return(l[1])
} else {
return(NA)
}
})
return(data.frame(fname, func = functions))
})
# Remove lines with func = NA
lutFunc2sourcefile = lutFunc2sourcefile[!is.na(lutFunc2sourcefile$func),]
你是什麼意思的函數調用GetFileName?你的意思是你想把你的函數作爲參數傳遞給GetFileName? – Dason 2012-02-14 06:47:15
你可以加入你對此問題的理由嗎?這聽起來相當奇特你想要的,也許我們可以建議一個替代方案... – 2012-02-14 06:49:02
相關問題:http://stackoverflow.com/questions/9132150/returning-directory-of-containing-file – 2012-02-14 06:50:11