2014-04-15 63 views
4

我有导入函数的问题。R:按名称输入函数/函数的输入子集

说我有A 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") 
+1

你可以把你的功能集合成一个包。你可以直接从包中获取特定的函数,但我想我的下一个问题是你为什么要这样做? – Dason

+0

这正是一个软件包的用途。特别是对于当前版本的'devtools',RStudio和'roxygen2',制作软件包从未如此简单。 – Gregor

回答

4

它看起来像你的代码将有轻微的变化工作:定义一个空的对象,你想先加载功能,然后使用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 [email protected]) 

mult对象有,我想​​涉及一种用于insertSource原来的应用程序的一些附加信息,但你可以得到与mult <- [email protected]摆脱他们,将设置mult仅限于实际的功能体。另外,您可能对github上的modules项目感兴趣,该项目试图实现R的包系统的轻量级版本以促进代码重用。似乎这可能是相关的,但我认为你必须将你的函数分割成不同子目录中的单独文件。

+0

Andy,感谢您的帮助。 – Brad

+0

感谢您指出'modules'项目。它看起来很有趣。 – ctbrown

+2

就像未来的参考资料一样,这里提到的“模块”包将*具有所需的功能[未来版本](https://github.com/klmr/modules/issues/3),虽然它不会还没有。 –

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

感谢您发布后续行动!这看起来非常有用。 – andybega