我已经玩了一下system()
和system2()
为乐趣,它让我感到我可以保存在一个对象的输出或退出状态。 一个玩具的例子:
X <- system("ping google.com",intern=TRUE)
给我的输出,而
X <- system2("ping", "google.com")
给我退出状态(在这种情况下1,谷歌不采取平)。 如果我想要输出和退出状态,我必须做2个系统调用,这似乎有点矫枉过正。 我怎样才能使用只有一个系统调用?
编辑:我想有两个在控制台中,如果可能的话,没有通过使用stdout="somefile.ext"
在system2
调用,并随后读入它的临时文件。
从R 2.15开始,当stdout
和/或stderr
为TRUE时, system2
将返回值作为一个属性。 这使得获取文本输出和返回值变得容易。
在这个例子中, ret
结束成为一个属性为"status"
的字符串:
> ret <- system2("ls","xx", stdout=TRUE, stderr=TRUE) Warning message: running command ''ls' xx 2>&1' had status 1 > ret [1] "ls: xx: No such file or directory" attr(,"status") [1] 1 > attr(ret, "status") [1] 1
我对你的system2描述有点困惑,因为它有stdout和stderr参数。 所以它能够返回退出状态,stdout和stderr。
> out <- tryCatch(ex <- system2("ls","xx", stdout=TRUE, stderr=TRUE), warning=function(w){w}) > out <simpleWarning: running command ''ls' xx 2>&1' had status 2> > ex [1] "ls: cannot access xx: No such file or directory" > out <- tryCatch(ex <- system2("ls","-l", stdout=TRUE, stderr=TRUE), warning=function(w){w}) > out [listing snipped] > ex [listing snipped]
我建议在这里使用这个功能:
robust.system <- function (cmd) { stderrFile = tempfile(pattern="R_robust.system_stderr", fileext=as.character(Sys.getpid())) stdoutFile = tempfile(pattern="R_robust.system_stdout", fileext=as.character(Sys.getpid())) retval = list() retval$exitStatus = system(paste0(cmd, " 2> ", shQuote(stderrFile), " > ", shQuote(stdoutFile))) retval$stdout = readLines(stdoutFile) retval$stderr = readLines(stderrFile) unlink(c(stdoutFile, stderrFile)) return(retval) }
这只适用于接受>和2>符号的类Unix的shell,cmd参数本身不应该重定向输出。 但它的确有诀窍:
> robust.system("ls -la") $exitStatus [1] 0 $stdout [1] "total 160" [2] "drwxr-xr-x 14 asieira staff 476 10 Jun 18:18 ." [3] "drwxr-xr-x 12 asieira staff 408 9 Jun 20:13 .." [4] "-rw-r--r-- 1 asieira staff 6736 5 Jun 19:32 .Rapp.history" [5] "-rw-r--r-- 1 asieira staff 19109 11 Jun 20:44 .Rhistory" $stderr character(0)