我最近完成了(Windows)系统更新,现在我无法再使用 R 运行系统命令。我尝试重新安装 R 和所有使用过的软件包,但这并不能解决我的问题。重启也没有解决问题。
我刚刚发现,虽然 system() 和 system2() 命令不再起作用,但 shell() 命令确实起作用。
> system('ECHO "test"')
Warning message:
running command 'ECHO "test"' had status 127
> system2('ECHO "test"')
Warning message:
running command 'ECHO \"test\"' had status 127
> shell('ECHO "test"')
"test"
Run Code Online (Sandbox Code Playgroud)
文档描述 shell() 应该是 system() 的一个简单的用户友好的包装器。因此我不明白为什么 shell() 可以工作,但系统却不能。
在另一台 system() 函数仍然可以工作的计算机上,我检查了差异。Windows 版本、R 版本和软件包版本是相同的(至少根据干净会话中的 sessionInfo() 是相同的)。与我可以使用的 system() 相比,Shell() 指定了一些额外的参数:
因此,我只能得出结论,shell() 在 system() 之上做了一些以某种方式改变其行为的事情。此行为未在文档中指定,也未通过任何参数访问。
我可以在哪里寻找两者之间的其他差异,以便找到此错误的根源?
首先我尝试是否可以重现此问题(在 Win10 上):
system('ECHO "test"')
#Warning message:
#running command 'ECHO "test"' had status 127
shell('ECHO "test"')
#"test"
Run Code Online (Sandbox Code Playgroud)
然后我查看了shell源代码,发现它在将命令传递给 之前更改了命令system。在我的系统上:
system('C:\\WINDOWS\\system32\\cmd.exe /c ECHO "test"')
#"test"
Run Code Online (Sandbox Code Playgroud)
另请参阅Sys.getenv("COMSPEC")如果为空则给出 shell Sys.getenv("R_SHELL")。请注意,文档指出 POSIX 标准要求在 shell 下运行命令。help("system")解释说,在类 Unix 操作系统上system启动 shell 并推荐shell(在 Windows 上)。