如何仅从 .R 文件导入函数而不执行整个文件

Sea*_*ite 5 r

假设我有一个 R 脚本 testScript.R

test <- function(){cat('Hello world')}
cat('Bye world')
Run Code Online (Sandbox Code Playgroud)

在 R 控制台中,我知道我可以test()通过以下方式导入该函数

source('testScript.R')
Run Code Online (Sandbox Code Playgroud)

但同时,它也会执行cat('Bye world')。假设不允许创建/修改文件,有没有办法只导入函数test()而不执行cat('Bye world')

MrF*_*ick 4

首先,我要说,这确实不是一个好主意。R 是一种函数式编程语言,因此函数就像常规对象一样。调用函数和分配函数之间没有明显的区别。这些几乎都是同一件事

a <- function(a) a+1
a(6)
# [1] 7

assign("a", function(i) i+1)
a(6)
# [1] 7

`<-`(a, function(i) i+1)
a(6)
# [1] 7
Run Code Online (Sandbox Code Playgroud)

定义函数和调用赋值函数没有区别。除非你运行函数,否则你永远不知道函数内的代码会做什么;因此,很难区分哪些代码创建了“函数”,哪些代码没有创建“函数”。正如 @mdsumner 指出的,您最好手动分离用于定义函数的代码和用于运行它们的代码。

也就是说,如果您想<-从代码文件中提取您使用的所有变量分配,您可以这样做

cmds <- parse("fakeload.R")
assign.funs <- sapply(cmds, function(x) {
   if(x[[1]]=="<-") {
       if(x[[3]][[1]]=="function") {
           return(TRUE)
       }
   }
   return(FALSE)
})
eval(cmds[assign.funs])
Run Code Online (Sandbox Code Playgroud)

这将评估“标准”形式的所有功能分配。