使用源函式執行另一個 R 指令碼
本文探討如何使用 source()
函式執行位於相同或不同目錄中的另一個 R 指令碼。
我們將為我們的檔案假設以下條件。
- 主指令碼的路徑被硬編碼在包裝指令碼的
source()
函式呼叫中。 - 主指令碼訪問的資源在同一目錄或其子目錄下;路徑必須相對於它。
R 中的 source
函式
我們可以使用 source()
函式讓 R 解析和評估儲存在 R 指令碼中的程式碼。
chdir
引數可以臨時將 R 的工作目錄更改為傳遞給 source()
的指令碼目錄。
在 R 中使用主指令碼的絕對路徑
如果包裝指令碼中主指令碼的路徑是絕對路徑,則它可以是檔案系統中相對於包裝指令碼的任何位置。我們需要在 source()
函式中使用 chdir = TRUE
以使 R 能夠找到主指令碼所需的資源。
例如,使用帶有以下程式碼的包裝指令碼。包裝檔案和主指令碼可以在任何地方。
# Get and print the working directory.
print("The starting working directory was:")
print(getwd())
# Call and process the main script file.
source("/absolute/path/to/main/script/filename.R", chdir = TRUE)
print("Final working directory")
print(getwd())
- 在任意資料夾中開啟一個終端視窗。
- 執行 R 命令獲取 R 命令列(控制檯)。
- 執行
getwd()
命令。
執行 R 命令的目錄是當前工作目錄。使用以下命令執行包裝指令碼,提供絕對路徑。
source("/absolute/path/to/wrapper/script/filename.R")
R 將執行包裝指令碼中的程式碼。它會將工作目錄臨時更改為主指令碼所在的目錄。
它將執行主指令碼,然後將工作目錄更改回撥用包裝指令碼的原始位置。
我們在呼叫包裝指令碼時沒有使用 chdir = TRUE
,因為主指令碼與包裝指令碼不在同一個資料夾中。
在 R 中使用主指令碼的相對路徑
如果主指令碼與包裝指令碼位於同一資料夾或子資料夾中,我們可以在包裝指令碼中使用主指令碼的相對路徑。
命令列中使用的 source()
函式首先讓 R 使用 chdir = TRUE
將工作目錄臨時更改為包裝指令碼。
如果主指令碼位於子資料夾中,則對包裝指令碼中的 source()
的呼叫再次使 R 臨時將工作目錄更改為主指令碼的工作目錄。
例如,使用包含以下程式碼的包裝檔案。
# Get and print the first temporary working directory.
print("The first temporary working directory is:")
print(getwd())
# Call and process the real file.
source("relative_path_from_wrapper_to_main_script/filename.R", chdir = TRUE)
print("Current temporary working directory")
print(getwd())
僅當主指令碼位於包含包裝指令碼的資料夾的子資料夾中時,才需要引數 chdir = TRUE
。
在任意資料夾中開啟 R,然後執行包裝指令碼,如下所示。
source("/absolute/path/to/wrapper/script/filename.R", chdir = TRUE)
現在,在命令列上呼叫包裝指令碼時需要 chdir = TRUE
,因為我們想首先將工作目錄更改為包裝指令碼的工作目錄。
如果我們在與包裝指令碼相同的目錄中開啟 R,則不需要路徑和 chdir
。
指令碼完成執行後,執行 getwd()
命令以驗證當前工作目錄是否是執行 R 的目錄。
まとめ
我們看到了如何結合 source()
函式和它的 chdir
引數從另一個包裝指令碼執行主 R 指令碼。
主指令碼的相對(甚至絕對)路徑必須在包裝指令碼中硬編碼。主指令碼訪問的資源應該和自己在同一個目錄下或者在一個子目錄下。