我有一個功能,我寫和保存在一個.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