2014-10-28 38 views
3

我想source()只能在.R文件中查找和加載函數。僅在.R文件中的源函數

例如,在文件Analysis.R:

print.hw <- function() { 
    print("hello world") 
} 

x <- 1 + 2 
... 

當我source("Analysis.R"),它會創建功能print.hw也分配x,我不想要的。

任何人有任何想法?我能找到的最好的就是這個問題:

Source only part of a file

+0

'source()'旨在執行文件中的所有命令。你的例子中的這兩個命令都將結果分配給一個變量。他們並沒有那麼不同。那麼'x <-function(a)函數(x)x + 1; B'-x(5); B(4)'。這兩個「創造功能」。你想同時運行它們嗎? – MrFlick 2014-10-28 23:36:03

+0

@RichardScriven,如果我能夠找到包含'function(...){'的行,並將它與關閉的'}配對,鏈接的答案將有所幫助。 – Alex 2014-10-28 23:38:04

+0

@MrFlick,我只想分配這些變量是函數的變量。我可以改述我的問題,說我只想執行所有與定義函數相關的命令。 – Alex 2014-10-28 23:39:28

回答

6

這工作,而無需使用正則表達式。它也可能比正則表達式解決方案的計算效率低。它創建一個新的環境,獲取整個文件,然後只返回全球環境的功能。

SourceFunctions<-function(file) { 
    MyEnv<-new.env() 
    source(file=file,local=MyEnv) 
    list2env(Filter(f=is.function,x=as.list(MyEnv)), 
      envir=parent.env(environment())) 
} 
+0

另請參閱:'sys.source' – GSee 2014-10-29 00:46:28

+5

以下是一些替代語法:'list2env(Filter(is.function,as.list(MyEnv)),globalenv())' – GSee 2014-10-29 00:52:10

+0

Good call @GSee。答案已更新。 :-) – Adam 2014-10-29 16:50:45

0

我認爲這是一個很好的做法,源文件月底前單獨的測試代碼(就像我們平時在Python),然後用外部腳本或程序包(如testthat)調用它們。哈德利的dplyr可能會給你一個參考。

+4

我不認爲這真的回答了這個問題;它只是說「不要那樣做」。更多的評論。 – 2015-10-26 02:55:57