r - 调用其中的函数时如何获取R脚本文件名?

标签 r function filenames plyr

我有几个 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/

相关文章:

r - 如何根据索引将函数应用于多维数组

javascript - 注入(inject)的 JavaScript 函数未执行

mysql - 如何使用 MySQL 实现 .NET Core Azure 功能

python - 不带 .py 后缀的 Sonar python 文件

r - 检查 R 中一个值的向量元素是否位于其他两个值的向量元素之间

r - GGally:从图中提取数据

c++ - c vector 可以存储多种数据类型吗?

filenames - 图像文件错误: Cannot work out file type of ".nii"

r - rHipe mapreduce获取正在处理的文件名

r - 在 ggplot2 中使用 scale_x_date 格式化日期