如何只导入.R文件中的函数而不执行整个文件

时间:2015-03-18 19:57:36

标签: r

我们说我有一个R脚本,testScript.R

test <- function(){cat('Hello world')}
cat('Bye world')

在R控制台中,我了解我可以通过

导入函数test()
source('testScript.R')

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

2 个答案:

答案 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;的所有功能分配。形式。