R: 按名称源函数/导入函数子集



我有一个关于导入函数的问题。

假设我有一个名为"函数"的R脚本,它看起来像这样:

mult <- function(x,y){
   return(x*y)
}
divide <- function(x,y){
   return(x/y)
}

目前我正在导入脚本中的所有函数:

source(file="C:\functions.R",echo=FALSE)

问题是(实际的)R脚本变得非常大。

有没有办法只导入"mult"函数?

我在查看evalSource/insertSource,但我的代码不起作用:

insertSource("C:\functions.R", functions="mult")  

您的代码似乎只需稍作更改即可工作:首先为要加载的函数定义一个空对象,然后使用insertSource

mult <- function(x) {0}
insertSource("C:\functions.R", functions="mult") 
mult 

哪个给出:

Object of class "functionWithTrace", from source
function (x, y) 
{
    return(x * y)
}
## (to see original from package, look at object@original)

mult对象有一些附加信息,我认为这些信息与insertSource的原始应用程序有关,但您可以使用mult <- mult@.Data来消除它们,这将仅将mult设置为实际的函数体。

此外,您可能对github上的modules项目感兴趣,该项目正试图实现R的包系统的轻量级版本,以便于代码重用。看起来这可能是相关的,尽管我认为您必须将函数拆分为不同子目录中的单独文件。

我最终创建了一些函数来执行您建议的操作。

第一组允许在一次调用中实现多个功能:

LoadFunction <- function(file,...) {
  dots <- match.call(expand.dots = FALSE)$...
  dots <- sapply(dots, as.character)
  output <- lapply(dots, function(x,file){eval(parse(text=paste(x," <- function(x) {0}",sep="")),envir = .GlobalEnv)
                                          suppressMessages(insertSource(file, functions=x))
                                          eval(parse(text=paste(x," <- ",x,"@.Data",sep="")),envir = .GlobalEnv) },file=file)
}

UnloadFunction <- function(...) {
  dots <- match.call(expand.dots = FALSE)$...
  dots <- sapply(dots, as.character)
  output <- lapply(dots, function(x,file){eval(parse(text=paste("rm(",x,",envir = .GlobalEnv)",sep="")))},file=file)
}

它们被称为:

LoadFunction(file="C:\functions.R",mult,divide)
UnloadFunction(mult,divide)

第二个是每次调用只有一个函数:

LoadFunction2 <- function(file,function_name) {
  eval(parse(text=paste(function_name," <- function(x) {0}",sep="")),envir = .GlobalEnv)
  suppressMessages(insertSource(file, functions=function_name))
  eval(parse(text=paste(function_name," <- ",function_name,"@.Data",sep="")),envir = .GlobalEnv)         
}
UnloadFunction2 <- function(function_name) {
  eval(parse(text=paste("rm(",function_name,",envir = .GlobalEnv)",sep="")))
}

它们被称为:

LoadFunction2(file="C:\functions.R","mult")
LoadFunction2(file="C:\functions.R","divide")
UnloadFunction2("mult")
UnloadFunction2("divide")

最新更新