使用源函数运行另一个 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 脚本。
主脚本的相对(甚至绝对)路径必须在包装脚本中硬编码。主脚本访问的资源应该和自己在同一个目录下或者在一个子目录下。