如何将源代码包含在R中的函数中?

时间:2015-11-17 20:27:37

标签: r function

我有一个我写的函数并保存在.R文件中。 我想在修改它时在另一个.R文件中获取代码。

例如,我想要的是:

file1代码:

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

file2代码:

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

但是,这似乎不起作用。

3 个答案:

答案 0 :(得分:3)

试试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))

答案 1 :(得分:3)

请注意,这些解决方案的一个显着优势是,每次func2运行时,它们都不会重新读取file1.R。

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=xx,则参数func <- function(x) sum(x)会生成错误由调用者提供,因为它将导致自我引用。真正想要的是:func <- sum甚至只是rails new

答案 2 :(得分:2)

现在,您的代码创建了一个函数,无论x输入如何,都会输出'file1.R'。你需要告诉函数运行旧函数。

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