我有一个关于导入函数的问题。
假设我有一个名为"函数"的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")