2015-11-17 78 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) 
} 
相關問題