2011-04-21 69 views
13

我已經在過去使用過R來對命令行進行非常基本的調用。該示例可以在here找到。R和系統調用

這一次,我希望模仿這個代碼在Windows的命令行運行成功:

> cd C:\Documents and Settings\BTIBERT\My Documents\My Dropbox\Eclipse\Projects\R\MLB\retrosheet\rawdata 
> bgame -y 2010 2010bos.eva >2010bos.txt 

這是我試圖運行裏面R.我已經設置了代碼工作目錄裏面的R.

dir <- paste("cd", getwd(), sep=" ") 
system(dir) 
system("bgame -y 2010 2010bos.eva >2010bos.txt") 

我相信這是用戶錯誤,但我做錯了什麼?它似乎最初工作,但返回以下錯誤。我很可能做錯了什麼,但我相信我正在使用相同的命令。

Expanded game descriptor, version 109(185) of 05/08/2008. 
    Type 'bgame -h' for help. 
Copyright (c) 2001 by DiamondWare. 
[Processing file 2010bos.eva.] 
>2010bos.txt: can't open. 
Warning message: 
running command 'bgame -y 2010 2010bos.eva >2010bos.txt' had status 2 

任何幫助,您可以提供將不勝感激。

回答

19

您需要發出一個system()調用的所有命令:

system(paste("cd",getwd() "&& bgame -y 2010 2010bos.eva >2010bos.txt",sep=" ")) 

你應該已經在你的工作目錄,所以我不知道該cd getwd()是必要的。你可能需要引用你的路徑,因爲它包含空格。錯誤可能通過在>附近放置空格來解決。

如果我是你的話,我會嘗試這樣的:

system("bgame -y 2010 2010bos.eva > 2010bos.txt") 

UPDATE:

而且你應該在節中的「Unix和Windows之間的區別」的?system,說聽從這一建議你應該使用shell

• The most important difference is that on a Unix-alike 
     ‘system’ launches a shell which then runs ‘command’. On 
     Windows the command is run directly - use ‘shell’ for an 
     interface which runs ‘command’ _via_ a shell (by default the 
     Windows shell ‘cmd.exe’, which has many differences from the 
     POSIX shell). 

     This means that it cannot be assumed that redirection or 
     piping will work in ‘system’ (redirection sometimes does, but 
     we have seen cases where it stopped working after a Windows 
     security patch), and ‘system2’ (or ‘shell’) must be used on 
     Windows. 
+0

感謝您的幫助。我遵循你的建議並忽略了目錄,但發現我必須在shell調用中包含shQuote才能表現不同。也就是說,它似乎有效,但我現在得到一個錯誤代碼1,這是奇怪的,因爲該文件看起來不錯,並且命令是相同的,我會在R以外的命令行上鍵入。 – Btibert3 2011-04-21 16:51:33

+0

你會知道嗎如何在Linux上完成相同的任務?看到我的[問題](http://stackoverflow.com/questions/36431465/warning-running-command-had-status-127-when-trying-to-run-exe-from-r) – Antoine 2016-04-06 08:38:17

0

是否破壞你的代碼,當你錯誤1或不executi繼續?

每當通過另一種語言執行系統命令時,在調用系統調用以查看到底發生了什麼之前打印系統調用會很有用,請拔出您打算使用的shell並檢查相同的錯誤。當命令正確執行時,這可能是bgame或R中的一個hickup。

如果你看一下http://astrostatistics.psu.edu/datasets/R/html/base/html/shell.html,你可以看到傳遞給系統調用的變量標誌。「標誌開關在shell下運行命令。 shell是bash或tcsh默認更改爲「-c」。「

Also "the shell to be used can be changed by setting the configure variable R_SHELL to a suitable value (a full path to a shell, e.g. /usr/local/bin/bash)."

8

已經沒有其他人發現,system("dir", intern = T)例如不工作,但你需要system("cmd.exe /c dir", intern = T)?只有後者對我有用。我在討論網站here(William Dunlap的帖子,大約下降了三分之一)發現了這一點。

此外,它不能與「cd」命令一起使用,但可以在R中使用setwd()函數,然後該命令將在該目錄內執行。

我創建了以下功能爲方便起見,用於執行程序和運行命令:

#the subject is an input file that a programme might require 
execute <- function(programme, subject.spec = "", intern = FALSE, wait = FALSE){ 
    if(!identical(subject.spec, "")){subject.spec <- paste0(" ", subject.spec)} #put space before the subject if it exists 
    system(paste0("cmd.exe /c ", programme, subject.spec), intern = intern, wait = wait) 
} 


command <- function(command, intern = TRUE, wait = FALSE){ 
    system(paste("cmd.exe /c", command), intern = T, wait = wait) 
} 
+0

什麼是等效的在Linux上? – Antoine 2016-04-06 08:26:07

+0

不能告訴你,對不起。 – Bazz 2016-04-06 08:30:11

+0

不用擔心謝謝 – Antoine 2016-04-06 08:33:17