2014-10-07 24 views
5

我不確定這是否可能,但我正在尋找類似於在R腳本中定義區域的內容。我想從另一個R腳本執行一組預先指定的行。我知道我可以使用source(filename)來運行整個文件,但不是運行整個文件,而只想在文件中運行幾行。從另一個R文件執行一組行

我可以在文件中定義regions或類似的東西,然後從另一個文件執行它嗎?

任何幫助將不勝感激。

+0

似乎您應該編寫R函數和構建包。 – 2014-10-07 22:15:02

回答

10

如果你擔心,一旦你添加新線的上游,那麼替代的感興趣區域將被轉移(或略

sourcePartial <- function(fn,startTag='#from here',endTag='#to here') { 
    lines <- scan(fn, what=character(), sep="\n", quiet=TRUE) 
    st<-grep(startTag,lines) 
    en<-grep(endTag,lines) 
    tc <- textConnection(lines[(st+1):(en-1)]) 
    source(tc) 
    close(tc) 
} 

現在你需要把一個小的,唯一的哈希標籤正上方和下方的感興趣區域的:作爲MrFlick的回答修改)版本將被讀取。如「#from here」和「#to here」

+0

誠實,我發表我的評論後,我只閱讀你的答案。 – 2014-10-07 22:13:29

+0

這完美的工作,正是我所期待的,非常感謝。 – Patthebug 2014-10-08 20:35:31

3

這聽起來不像一個超安全的想法,因爲在編輯過程中行號可以輕鬆改變。似乎最安全的做法是將較大的源文件分成更小的部分,以便安全地包含和運行。但你可以做這樣的事情

sourcePartial <- function(fn, skip=0, n=-1) { 
    lines <- scan(fn, what=character(), sep="\n", skip=skip, n=n, quiet=TRUE) 
    tc <- textConnection(lines) 
    source(tc) 
    close(tc) 
} 

這裏我們使用scan()來讀取文件中的行。請參閱skip=n=的文檔?scan以瞭解如何跳過一定數量的行並在某個數字後停止讀取。所以

sourcePartial("test.R", 4, 11) 

將從「test.R」跑線5-15

+0

我想你可以寫一些更一般的東西,如果海報願意將源文件分成具有常見(註釋)標題標籤的部分,比如'#header:Region_4',你可以通過一遍讀取找到包含標題的行,然後根據名稱或序列號選擇目標部分。 – 2014-10-07 22:11:39

+0

感謝您的回答,我認爲廣義版本更好。 – Patthebug 2014-10-08 20:44:29

+0

好吧,如果這就是你想要的,最好在原始問題中描述一下。另一個版本對文件內容做了更多的假設。 – MrFlick 2014-10-08 20:45:35