Что я хотел бы сделать, это создать справочную таблицу, которая сопоставляет функцию с файлом .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
.
EDIT : С учетом вашего комментария к нефункциональному коду этот код использует синтаксический анализ, который не оценивает код.Он просматривает результаты анализа и отсеивает функции и не должен оценивать какой-либо код или код возврата, который не является функцией.Я не проверил это исчерпывающе, попробуй.
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),]