假设我有一个 R 脚本 testScript.R
test <- function(){cat('Hello world')}
cat('Bye world')
在 R 控制台中,我知道我可以test()通过以下方式导入该函数
source('testScript.R')
但同时,它也会执行cat('Bye world')。假设不允许创建/修改文件,有没有办法只导入函数test()而不执行cat('Bye world')?
首先,我要说,这确实不是一个好主意。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
定义函数和调用赋值函数没有区别。除非你运行函数,否则你永远不知道函数内的代码会做什么;因此,很难区分哪些代码创建了“函数”,哪些代码没有创建“函数”。正如 @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])
这将评估“标准”形式的所有功能分配。