R语言中的shell()函数是否能保留之前命令的执行状态?
状态不保留的原因
每次调用R的shell()函数都会独立启动一个全新的cmd.exe进程,每个进程的工作目录、环境变量等运行状态都是相互隔离的,单次调用结束后对应的进程就会直接销毁,上一次调用产生的状态变更不会传递到后续新启动的shell进程中。你第一次执行的cd命令只会在第一个临时shell进程内生效,后续调用shell()启动的新进程默认会继承R本身的当前工作目录,自然不会保留之前的路径切换结果。
多依赖命令的执行方案
你可以通过以下几种方式执行有前后依赖关系的命令:
- 合并命令单次调用
把多个有依赖的命令用&(前序命令执行完就执行后序)或者&&(前序命令执行成功才执行后序)拼接成一行,单次调用shell()执行即可:
注意R中填写Windows路径时,反斜杠需要转义为双反斜杠,或者直接使用正斜杠,比如路径shell("cd <file location> && activate.bat")C:\Users\test\bat需要写为C:\\Users\\test\\bat或者C:/Users/test/bat。 - 先修改R的工作目录再执行命令
shell进程默认会继承R本身的当前工作目录,你可以先通过R的setwd()函数切换工作目录到目标路径,再直接执行批处理文件:setwd("<file location>") shell("activate.bat") - 写入临时批处理文件执行
如果需要执行的命令较多,你可以把所有命令按顺序写入临时批处理文件,再调用shell()运行该文件:# 构造批处理命令内容 bat_cmd <- c( "cd <file location>", "activate.bat", "rem 可添加更多需要连续执行的命令" ) # 写入临时批处理文件 writeLines(bat_cmd, con = "temp_exec.bat") # 执行批处理 shell("temp_exec.bat") # 执行完成后可删除临时文件 file.remove("temp_exec.bat")
如果你需要捕获命令的执行输出,可以在shell()中添加intern = TRUE参数,返回值会直接存储命令的标准输出内容。
内容的提问来源于stack exchange,提问作者Meta
相关产品推荐
相关产品推荐

