我有一个我写的函数并保存在.R文件中。 我想在修改它时在另一个.R文件中获取代码。
例如,我想要的是:
file1代码:
func <- function(x=x) {sum(x)}
file2代码:
func2 <- function(x) {source('file1.R')}
func2(x=c(2:3))
[1] 5
但是,这似乎不起作用。
答案 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=x
是x
,则参数func <- function(x) sum(x)
会生成错误由调用者提供,因为它将导致自我引用。真正想要的是:func <- sum
甚至只是rails new
。
答案 2 :(得分:2)
现在,您的代码创建了一个函数,无论x输入如何,都会输出'file1.R'。你需要告诉函数运行旧函数。
func2 <- function(x){
source('file1.R',local=TRUE)
func(x)
}