我们说我有一个R脚本,testScript.R
test <- function(){cat('Hello world')}
cat('Bye world')
在R控制台中,我了解我可以通过
导入函数test()
source('testScript.R')
但与此同时,它也会执行cat('Bye world')
。假设不允许创建/修改文件,是否有办法仅导入函数test()
而不执行cat('Bye world')
?
答案 0 :(得分:3)
哦,伙计......这很有趣。如果没有像这样的暴行,我不知道有什么方法可以做到这一点:
# assume your two like script is stored in testScript.R
a <- readLines("testScript.R")
a <- paste(a, collapse="\n")
library(stringr)
func_string <- str_extract(a, "[a-z]+ <- function.+}")
test <- eval(parse(text=func_string))
> test()
Hello world
您肯定需要使用正则表达式来提取函数。如果有多个函数,str_extract_all()
将会有所帮助。祝你好运。
答案 1 :(得分:1)
首先,我要说这不是一个好主意。 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
定义函数和调用赋值函数之间没有区别。除非你运行它,否则你永远不知道函数内部的代码会做什么。因此,判断哪些代码创建了&#34;函数&#34;并不容易。哪个没有。正如@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])
这将评估&#34;标准&#34;的所有功能分配。形式。