2014-04-15 64 views
4

我有導入函數的問題。R:按名稱輸入函數/函數的輸入子集

說我有A R劇本名爲「功能」,它看起來是這樣的:

mult <- function(x,y){ 

    return(x*y) 

} 

divide <- function(x,y){ 

    return(x/y) 

} 

目前我進口的所有功能的腳本:

source(file="C:\\functions.R",echo=FALSE) 

的問題是,(實際)R腳本變得非常大。

有沒有辦法只導入「mult」函數?

我看着evalSource/insertSource但我的代碼是行不通的:

insertSource("C:\\functions.R", functions="mult") 
+1

你可以把你的功能集合成一個包。你可以直接從包中獲取特定的函數,但我想我的下一個問題是你爲什麼要這樣做? – Dason

+0

這正是一個軟件包的用途。特別是對於當前版本的'devtools',RStudio和'roxygen2',製作軟件包從未如此簡單。 – Gregor

回答

4

它看起來像你的代碼將有輕微的變化工作:定義一個空的對象,你想先加載功能,然後使用insertSource

mult <- function(x) {0} 
insertSource("C:\\functions.R", functions="mult") 
mult 

其中給出:

Object of class "functionWithTrace", from source 
function (x, y) 
{ 
    return(x * y) 
} 

## (to see original from package, look at [email protected]) 

mult對象有,我想​​涉及一種用於insertSource原來的應用程序的一些附加信息,但你可以得到與mult <- [email protected]擺脫他們,將設置mult僅限於實際的功能體。另外,您可能對github上的modules項目感興趣,該項目試圖實現R的包系統的輕量級版本以促進代碼重用。似乎這可能是相關的,但我認爲你必須將你的函數分割成不同子目錄中的單獨文件。

+0

Andy,感謝您的幫助。 – Brad

+0

感謝您指出'modules'項目。它看起來很有趣。 – ctbrown

+2

就像未來的參考資料一樣,這裏提到的「模塊」包將*具有所需的功能[未來版本](https://github.com/klmr/modules/issues/3),雖然它不會還沒有。 –

3

我最終創建了功能來完成你的建議。

此第一組可用於多種功能在一個調用:

LoadFunction <- function(file,...) { 

    dots <- match.call(expand.dots = FALSE)$... 
    dots <- sapply(dots, as.character) 

    output <- lapply(dots, function(x,file){eval(parse(text=paste(x," <- function(x) {0}",sep="")),envir = .GlobalEnv) 
              suppressMessages(insertSource(file, functions=x)) 
              eval(parse(text=paste(x," <- ",x,"@.Data",sep="")),envir = .GlobalEnv) },file=file) 

} 


UnloadFunction <- function(...) { 

    dots <- match.call(expand.dots = FALSE)$... 
    dots <- sapply(dots, as.character) 

    output <- lapply(dots, function(x,file){eval(parse(text=paste("rm(",x,",envir = .GlobalEnv)",sep="")))},file=file) 

} 

它們被稱爲是這樣的:

LoadFunction(file="C:\\functions.R",mult,divide) 
UnloadFunction(mult,divide) 

第二種是每次呼叫只有一個函數:

LoadFunction2 <- function(file,function_name) { 

    eval(parse(text=paste(function_name," <- function(x) {0}",sep="")),envir = .GlobalEnv) 
    suppressMessages(insertSource(file, functions=function_name)) 
    eval(parse(text=paste(function_name," <- ",function_name,"@.Data",sep="")),envir = .GlobalEnv)   

} 

UnloadFunction2 <- function(function_name) { 

    eval(parse(text=paste("rm(",function_name,",envir = .GlobalEnv)",sep=""))) 

} 

他們被這樣調用:

LoadFunction2(file="C:\\functions.R","mult") 
LoadFunction2(file="C:\\functions.R","divide") 
UnloadFunction2("mult") 
UnloadFunction2("divide") 
+0

感謝您發佈後續行動!這看起來非常有用。 – andybega