我有几个 R 脚本文件,例如 f1.R
, f2.R
, f3.R
.
我有另一个名为 AddSignal(signal) 的函数,它将信号向量添加到列表中。 f1.R、f2.R 等中的函数可以调用此 AddSignal() 函数。
现在我想要的是,在函数 AddSignal() 中,除了做加信号部分之外,它还记录了哪个函数在哪个 R 文件中进行了调用。例如,我想知道 f1.R 中的函数 ff1() 添加了信号 sig1。
有没有办法做到这一点?
实际上,使用sys.call(),我可以知道哪个函数(例如ff1())调用了AddSignal()。但我不知道 ff1() 在哪个 R 文件中。我可以看到一种很难做到的方法,就是扫描所有 .R 文件,然后存储文件名和函数名的映射。但我想看看是否有更简单的方法。
谢谢。
最佳答案
我要做的是创建一个查找表,将函数映射到 .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,对代码不求值。它搜索 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),]
关于r - 调用其中的函数时如何获取R脚本文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272685/