2011-04-21 9 views
13

He usado R en el pasado para hacer llamadas muy básicas a la línea de la llamada. El ejemplo se puede encontrar here.R y llamadas al sistema

Esta vez, estoy buscando a imitar este código que se ejecuta correctamente desde la línea de comandos en Windows:

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

Este es el código que estoy tratando de correr en el interior de R. Ya he expuesto la directorio de trabajo en el interior de R.

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

estoy seguro de que esto es un error del usuario, pero lo que estoy haciendo mal? Parece que funciona inicialmente, pero devuelve el siguiente error. Muy bien podría estar haciendo algo mal, pero creo que estoy usando los mismos comandos.

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 

Cualquier ayuda que pueda proporcionar será apreciada.

Respuesta

19

necesita emitir todos los comandos en una system() llamada:

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

que ya debería estar en el directorio de trabajo, así que no estoy seguro de que el cd getwd() es necesario. Y es posible que necesite comillas en su camino porque contiene espacios. El error puede resolverse poniendo espacios alrededor de >.

Si yo estuviera en tu lugar, me gustaría probar esto:

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

ACTUALIZACIÓN:

Y probablemente debería prestar atención a este consejo en las "Diferencias entre Unix y Windows" de ?system que dice se debe utilizar 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

Gracias por la ayuda. Seguí tu consejo e ignoré el directorio, pero descubrí que tenía que incluir shQuote dentro de una llamada de shell para que se comportara de manera diferente. Dicho esto, parece que funcionó, pero ahora recibo un código de error 1, lo cual es extraño, ya que el archivo se ve bien y el comando es idéntico a lo que escribiría en la línea de comando fuera de R. – Btibert3

+0

¿ustedes saben? cómo lograr la misma tarea en Linux? Ver mi [pregunta] (http://stackoverflow.com/questions/36431465/warning-running-command-had-status-127-when-trying-to-run-exe-from-r) – Antoine

0

¿rompe el código de error al obtener 1 o hace executi en continuar?

Siempre que ejecute comandos del sistema a través de otro idioma, es útil imprimir la llamada del sistema antes de llamar para ver exactamente lo que está sucediendo, extraer el intérprete que tiene la intención de usar y verificar el mismo error. Como el comando se ejecuta correctamente, esto podría ser un hickup en bgame o R.

Si mira http://astrostatistics.psu.edu/datasets/R/html/base/html/shell.html puede ver el indicador de variable pasado a la llamada al sistema. "Marque el interruptor para ejecutar un comando debajo del shell. el shell es bash o tcsh, el valor predeterminado se cambia a "-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

Ha nadie más encontrado que system("dir", intern = T) por ejemplo, no funciona, sino que es necesario system("cmd.exe /c dir", intern = T)? Solo el último funciona para mí. Encontré esto en el sitio de discusión here (publicación de William Dunlap, aproximadamente un tercio del camino hacia abajo).

Además, no funciona con el comando "cd", pero puede usar la función setwd() dentro de R y luego el comando se ejecutará dentro de ese directorio.

que crearon las siguientes funciones para la comodidad, para la ejecución de programas y la ejecución de comandos:

#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

cuál sería el equivalente en Linux? – Antoine

+0

No se lo pude decir, lo siento. – Bazz

+0

no se preocupe gracias – Antoine

Cuestiones relacionadas