【问题标题】:R: Source function by name/Import subset of functionsR:按名称/导入函数子集的源函数
【发布时间】:2014-05-30 07:56:06
【问题描述】:

我对导入函数有疑问。

假设我有一个名为“函数”的 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")  

【问题讨论】:

  • 你可以把你的函数集变成一个包。您可以直接从包中获取特定功能,但我想我的下一个问题是您为什么要这样做?
  • 这正是包的用途。尤其是使用当前版本的devtools、RStudio 和roxygen2,制作包从未如此简单。

标签: r function import external


【解决方案1】:

看起来您的代码只需稍作改动即可工作:为您要加载的函数定义一个空对象,然后使用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 &lt;- mult@.Data 删除它们,这会将 mult 设置为仅实际的函数体.

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

【讨论】:

  • 安迪,谢谢你的帮助。
  • 感谢您指出modules 项目。看起来很有趣。
  • 作为一个注释以供将来参考,这里提到的“模块”包将具有所需的功能in a future version,尽管它还没有。跨度>
  • 我收到了Error in .guessPackageName(env),但不知道为什么
【解决方案2】:

我最终创建了函数来执行您的建议。

第一组允许在一个调用中使用多个函数:

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

【讨论】:

  • 感谢您发布后续消息!这看起来很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 2022-11-02
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多