在 RStudio 中调用系统命令时出现问题
Problems when invoking a system command in RStudio
我正在尝试通过 R 的 IDE RStudio 调用系统命令来 运行 一个 exe
文件。我的 OS 是 Windows。
我有以下目录层次结构:
|_scripts
|_files
|_prog.exe
|_data
|_executed_data
|_case1
|_case2
我的 exe
文件存储在 files
目录中。经过争论的、随时可用的数据存储在特定的 case#
目录中,其中 # 代表该案例的相应编号。
代码是模块化的。我编写函数,然后使用 purrr::map
在长度与案例数相同的向量上迭代该函数。
代码如下所示:
#Library(processx)
#Library(purrr)
run_exe = function(directory) {
# Copy .exe file to folder to run
from_dir = c("../files/prog.exe")
to_dir = paste0("../data/executed_data/", directory)
file.copy(from = from_dir, to = to_dir, overwrite = T)
# Run .exe file
processx::run( command = paste0("../data/executed_data/",directory,"/prog.exe" )
}
# Run function over all cases
all_cases = list.files("../data/executed_data")
purrr::map(all_cases, run_exe)
使用 map
进行 运行 的尝试失败,并向控制台打印一条错误消息。打印的消息说 exe
文件的子例程之一找不到特定文件,因此出现错误。
我注意到假定丢失的文件的名称以小写形式打印,因此我重命名了该文件以确保所有字母都很小。仍然,它没有用。
消息还说 error.err
文件已打印。发生错误时确实会打印此文件,但是,如果我直接转到 cases#
目录之一并双击 exe
文件,它 运行 没有问题。由于 运行 没有问题,我知道没有丢失文件。
考虑到这个问题涉及 运行 一个 exe
文件,我认为不可能有一个可重现的例子。但是,如果您在尝试调用系统功能时遇到类似问题,请分享您找到的解决方案。
P.S.: 在使用 processx::run 之前,我试过 system
、system2
和 sys
函数,但同样没有成功。
这样做就可以了:
# List all directory paths. These are the directories where data are stored.
all_dir = dir(here::here('data', 'executed_data'), full.names = TRUE)
# Function to process all your data. Note the arg "wd"
process_data = function (data_dir) {
processx::run(here::here('files', 'prog.exe'), wd = data_dir)
}
# Iterate over all directories
purrr::map(.x = all_dir, .f = process_data)
重要的是 .Rproj
与目录 scripts
、files
、data
.
处于同一级别
我正在尝试通过 R 的 IDE RStudio 调用系统命令来 运行 一个 exe
文件。我的 OS 是 Windows。
我有以下目录层次结构:
|_scripts
|_files
|_prog.exe
|_data
|_executed_data
|_case1
|_case2
我的 exe
文件存储在 files
目录中。经过争论的、随时可用的数据存储在特定的 case#
目录中,其中 # 代表该案例的相应编号。
代码是模块化的。我编写函数,然后使用 purrr::map
在长度与案例数相同的向量上迭代该函数。
代码如下所示:
#Library(processx)
#Library(purrr)
run_exe = function(directory) {
# Copy .exe file to folder to run
from_dir = c("../files/prog.exe")
to_dir = paste0("../data/executed_data/", directory)
file.copy(from = from_dir, to = to_dir, overwrite = T)
# Run .exe file
processx::run( command = paste0("../data/executed_data/",directory,"/prog.exe" )
}
# Run function over all cases
all_cases = list.files("../data/executed_data")
purrr::map(all_cases, run_exe)
使用 map
进行 运行 的尝试失败,并向控制台打印一条错误消息。打印的消息说 exe
文件的子例程之一找不到特定文件,因此出现错误。
我注意到假定丢失的文件的名称以小写形式打印,因此我重命名了该文件以确保所有字母都很小。仍然,它没有用。
消息还说 error.err
文件已打印。发生错误时确实会打印此文件,但是,如果我直接转到 cases#
目录之一并双击 exe
文件,它 运行 没有问题。由于 运行 没有问题,我知道没有丢失文件。
考虑到这个问题涉及 运行 一个 exe
文件,我认为不可能有一个可重现的例子。但是,如果您在尝试调用系统功能时遇到类似问题,请分享您找到的解决方案。
P.S.: 在使用 processx::run 之前,我试过 system
、system2
和 sys
函数,但同样没有成功。
这样做就可以了:
# List all directory paths. These are the directories where data are stored.
all_dir = dir(here::here('data', 'executed_data'), full.names = TRUE)
# Function to process all your data. Note the arg "wd"
process_data = function (data_dir) {
processx::run(here::here('files', 'prog.exe'), wd = data_dir)
}
# Iterate over all directories
purrr::map(.x = all_dir, .f = process_data)
重要的是 .Rproj
与目录 scripts
、files
、data
.