2015-11-17 27 views
2

我有一个功能,我写和保存在一个.R文件。 我想在修改它时在另一个.R文件中源代码。如何将源代码包含到R中的函数中?

例如,我要的是:

文件1代码:

func <- function(x=x) {sum(x)} 

文件2代码:

func2 <- function(x) {source('file1.R')} 
func2(x=c(2:3)) 
[1] 5 

然而,这似乎并没有工作。

+3

作为一种替代方案,如果您正在其他函数中寻找文件,那么可能是时候开始将这些东西移动到一个包中。 – joran

回答

2

尝试source("file1.R", local=TRUE)。这将使评估发生在函数的范围内,而不是(默认行为)工作区的范围。

但是,你目前有它写,它仍然不会因为你的file1是定义一个函数,但没有评估它的工作。

达到你想要的行为,你会想是这样的:

## file1.R ## 
s <- sum(x) 

## file2.R ## 
func2 <- function(x) { 
    source("file1.R", local=TRUE) 
    return(s) 
} 
func2(x=c(2,3)) 
2

注意,这些解决方案的显著优点是它们不重读file1.R每次func2运行。

1)源到工作区源呼叫将定义FUNC然后我们定义func2是相同func最后我们任选除去func。此时我们可以运行func2

source('file1.R') 
func2 <- func 
rm(func) # optional 
func2(x=c(2:3)) 

2)源到本地环境另一种方法是到源在本地环境定义func该文件,并在本地环境中的最后一个语句分配给func2;然而,func2本身在本地环境之外。的func2的定义之后,func将不可见,但func2会。请注意,source语句仅运行一次,只有func分配给func2,因此source语句在每次运行func2时都不运行。

func2 <- local({ 
    source("file1.R", local = TRUE) 
    func 
}) 
func2(x=c(2:3)) 

3)模块封装

github安装模块包(此包为您提供了source和全R封装之间的事情了一半后)试试这个:

# devtools::install_github('klmr/modules') 

library(modules) 

file1 <- import("file1") 
func2 <- file1$func 
func2(3:4) 

注意:即在file1.R中func的问题定义中,参数如果调用者未提供x,则将生成错误,因为它会导致自引用。真正想要的是:func <- function(x) sum(x)甚至只是func <- sum

1

现在,您的代码创建了一个功能,哪些源的文件1。R',而不管x输入。您还需要告诉该函数运行旧函数。

func2 <- function(x){ 
    source('file1.R',local=TRUE) 
    func(x) 
} 
相关问题