2017-01-18 19 views
0

我有一個涉及數據操作和估計的長腳本。我將它設置爲使用一組參數,但我希望能夠使用不同的輸入類型(如函數)多次運行此腳本。將腳本作爲函數

運行腳本會生成圖並將估計值保存到csv,我並不特別關心它創建的對象。

我寧願不將腳本包裝在函數中,因爲它是爲了交互使用。 人們如何去做這樣的事情?

我發現這個命令行參數:How to pass command-line arguments when source() an R file但仍不能解決問題互動

+0

我很努力地理解如何使它成爲一個功能,意味着你不能「交互使用它」。 – joran

+0

通過交互我的意思是有時我想運行腳本一行一行,我可以使用瀏覽器,但它不是最佳的... –

+0

然後,我建議使它成爲一個函數,當你想要逐行運行它,如果你想以塊爲單位運行設置參數並按塊運行功能塊的內容。如果您希望瀏覽器只是將瀏覽器放入該功能,請再次輸入並運行。 – Hansi

回答

0

我處理過類似的事情之前。以下是我提出的解決方案。 我基本上使用list2env推動變量到全局或功能的本地環境 和我然後source功能在指定的環境。

這可以是非常有用的,尤其是當與下面的示例中所示的exists結合使用時,可以使腳本保持獨立。

這兩個問題也可能會有所幫助: Source-ing an .R script within a function and passing a variable through (RODBC) How to pass command-line arguments when source() an R file

# Function ---------------------------------------------------------------- 
subroutine <- function(file, param = list(), local = TRUE, ...) { 
    list2env(param, envir = if (local) environment() else globalenv()) 
    source(file, local = local, ...) 
} 


# Example ----------------------------------------------------------------- 
# Create an example script 
tmp <- "test_subroutine.R" 
cat("if (!exists('msg')) msg <- 'no argument provided'; print(msg)", file = tmp) 

# Example of using exists in the script to keep it stand-alone 
subroutine(tmp) 

# Evaluate in functions environment 
subroutine(tmp, list(msg = "use function's environment"), local = TRUE) 
exists("msg", envir = globalenv()) # FALSE 

# Evaluate in global environment 
subroutine(tmp, list(msg = "use global environment"), local = FALSE) 
exists("msg", envir = globalenv()) # TRUE 

unlink(tmp) 
-1

在基礎包,檢查?commandArgs,您可以使用此命令行解析出參數。

如果我有一個腳本,test.R,包含代碼:

args <- commandArgs(trailingOnly=TRUE) 

for (arg in args){ 
    print(arg) 
} 

和我與rscript稱之爲從命令行如下:

rscript test.R arg1 arg2 arg3 

的輸出是:

[1] "arg1" 
[1] "arg2" 
[1] "arg3" 
相關問題