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

时间:2014-04-15 19:21:55

标签: r function import external

我对导入函数有疑问。

假设我有一个名为&#34的R脚本;函数"看起来像这样:

mult <- function(x,y){

   return(x*y)

}

divide <- function(x,y){

   return(x/y)

}

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

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

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

有没有办法导入&#34; mult&#34;只是功能?

我正在查看evalSource / insertSource,但我的代码无效:

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

2 个答案:

答案 0 :(得分:5)

看起来你的代码会稍微改变一下:为你想要首先加载的函数定义一个空对象,然后使用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删除它们,这将设置{{1}只到实际的函数体。

此外,您可能对github上的modules项目感兴趣,该项目正在尝试实现轻量级的R&R软件包系统,以便于代码重用。似乎这可能是相关的,虽然我认为你必须将你的功能分成不同子目录中的单独文件。

答案 1 :(得分:3)

我最终创建的功能可以完成您的推荐。

第一组允许在一次通话中使用多种功能:

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")