我有一个功能,我写和保存在一个.R文件。 我想在修改它时在另一个.R文件中源代码。如何将源代码包含到R中的函数中?
例如,我要的是:
文件1代码:
func <- function(x=x) {sum(x)}
文件2代码:
func2 <- function(x) {source('file1.R')}
func2(x=c(2:3))
[1] 5
然而,这似乎并没有工作。
我有一个功能,我写和保存在一个.R文件。 我想在修改它时在另一个.R文件中源代码。如何将源代码包含到R中的函数中?
例如,我要的是:
文件1代码:
func <- function(x=x) {sum(x)}
文件2代码:
func2 <- function(x) {source('file1.R')}
func2(x=c(2:3))
[1] 5
然而,这似乎并没有工作。
尝试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))
注意,这些解决方案的显著优点是它们不重读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。R',而不管x输入。您还需要告诉该函数运行旧函数。
func2 <- function(x){
source('file1.R',local=TRUE)
func(x)
}
作为一种替代方案,如果您正在其他函数中寻找文件,那么可能是时候开始将这些东西移动到一个包中。 – joran