r-system()返回错误,但shell()有效



我最近进行了(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"

文档描述了shell()应该是一个简单的、用户友好的系统包装器。所以我不明白为什么shell()能工作,但系统却不能。

对于另一台系统()函数仍然可以工作的计算机,我已经检查了差异。Windows版本、R版本和软件包版本是相等的(至少根据干净会话中的sessionInfo())。Shell()指定了一些与system()相比的额外参数,我可以使用这些参数:

  • shell指定要使用的shell。"详细信息"部分告诉我,这将检查两个环境变量:R_SHELL和COMSPEC。R_SHELL不是在两个系统(全局和本地)上都定义的。COMSPEC已定义,并在两个系统上引用cmd.exe(在同一文件夹中)。我已经通过这个可执行文件检查并运行了纯命令
  • flag不知道它的作用,但它与system()命令不同。据我所知,改变它的唯一原因是使用不同的shell/OS(例如Linux上的Bash)
  • intern对于shell()和system()都设置为FALSE
  • 等待将shell()和system()都设置为TRUE
  • 设置为TRUE,但系统调用不包含"/"或"\"。正如预期的那样,使用这个布尔值不会改变结果
  • mustWork在出现错误时与输出相关。将返回错误或警告。更改此布尔值不会更改行为

因此,我只能得出结论,shell()在system()之上做了一些事情,以某种方式改变了它的行为。文档中未指定此行为,也未通过任何参数访问此行为。

我在哪里可以查找两者之间的其他差异,以便找到这个错误的来源?

我第一次尝试是否可以复制这个(在Win10上):

system('ECHO "test"')
#Warning message:
#running command 'ECHO "test"' had status 127
shell('ECHO "test"')
#"test"

然后我查看了shell的源代码,发现它在将命令传递给system之前更改了命令。在我的系统上:

system('C:\WINDOWS\system32\cmd.exe /c ECHO "test"')
#"test"

另请参阅Sys.getenv("COMSPEC"),如果Sys.getenv("R_SHELL")为空,则会给出shell。注意,文档指出POSIX标准要求在shell下运行命令。help("system")解释说,在类似Unix的操作系统上,system会启动一个shell并推荐shell(在Windows上)。

最新更新