我对导入函数有疑问。
假设我有一个名为&#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")
答案 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")