我正在尝试在R中复制一个shell命令,并且无法弄清楚如何将命令串在一起.这只返回工作文件夹的内容(system()由于某种原因失败):
> shell("dir")
Volume info ..
Directory of E:\Documents\R
contents are listed..
Run Code Online (Sandbox Code Playgroud)
现在让我们尝试导航到C盘并运行dir(不使用明显的dir C:)..
> shell("cd C:")
C:\
> shell("dir")
Volume in drive E is GT
etc..
Run Code Online (Sandbox Code Playgroud)
所以似乎命令不能单独输入,因为shell不记得工作目录.所以..
> (cmd = "cd C:
+ dir")
[1] "cd C:\ndir"
> shell(cmd)
C:\
Run Code Online (Sandbox Code Playgroud)
没有运气,因为没有报告C:文件夹.我尝试过的其他方法也失败了.感谢任何想法.
该文档解释了为什么system\xe2\x80\x99 不起作用:它直接在 Windows 上执行命令,而不先生成 shell。
shell(或者更好,system2)是要走的路,但正如您\xe2\x80\x99所注意到的那样,shell总是会生成一个新的shell,以便对环境的更改不会继续\xe2\x80\x99。system2不会直接工作,因为它引用了它的命令(因此不允许命令链接)。
在这种情况下,正确的解决方案是不要使用 shell 命令来更改目录。使用setwd:
setwd(\'C:\')\nsystem2(\'dir\')\nRun Code Online (Sandbox Code Playgroud)\n\n如果要在执行命令后重置工作目录,请使用以下命令:
\n\nlocal({\n oldwd = getwd()\n on.exit(setwd(oldwd))\n setwd(\'C:\')\n system2(\'dir\')\n})\nRun Code Online (Sandbox Code Playgroud)\n
我在 Linux 上,这对我有用:
system("cd ..;ls")
Run Code Online (Sandbox Code Playgroud)
导航到上一个目录并在那里运行 ls/dir 。就您而言,在 Windows 上,这显然有效:
shell("cd C: & dir")
Run Code Online (Sandbox Code Playgroud)
或获取字符向量输出:
shell("cd C: & dir", intern=T)在 Linux 上:system("cd ..; ls", intern=T)