我有一個涉及數據操作和估計的長腳本。我將它設置爲使用一組參數,但我希望能夠使用不同的輸入類型(如函數)多次運行此腳本。將腳本作爲函數
運行腳本會生成圖並將估計值保存到csv,我並不特別關心它創建的對象。
我寧願不將腳本包裝在函數中,因爲它是爲了交互使用。 人們如何去做這樣的事情?
我發現這個命令行參數:How to pass command-line arguments when source() an R file但仍不能解決問題互動
我有一個涉及數據操作和估計的長腳本。我將它設置爲使用一組參數,但我希望能夠使用不同的輸入類型(如函數)多次運行此腳本。將腳本作爲函數
運行腳本會生成圖並將估計值保存到csv,我並不特別關心它創建的對象。
我寧願不將腳本包裝在函數中,因爲它是爲了交互使用。 人們如何去做這樣的事情?
我發現這個命令行參數:How to pass command-line arguments when source() an R file但仍不能解決問題互動
我處理過類似的事情之前。以下是我提出的解決方案。 我基本上使用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)
在基礎包,檢查?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"
我很努力地理解如何使它成爲一個功能,意味着你不能「交互使用它」。 – joran
通過交互我的意思是有時我想運行腳本一行一行,我可以使用瀏覽器,但它不是最佳的... –
然後,我建議使它成爲一個函數,當你想要逐行運行它,如果你想以塊爲單位運行設置參數並按塊運行功能塊的內容。如果您希望瀏覽器只是將瀏覽器放入該功能,請再次輸入並運行。 – Hansi