web-dev-qa-db-fra.com

Appels R et système

J'ai utilisé R par le passé pour faire des appels très basiques à la ligne de communication. L'exemple peut être trouvé ici .

Cette fois-ci, je cherche à imiter ce code qui s'exécute avec succès à partir de la ligne de commande dans Windows:

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

C’est le code que j’essaie d’exécuter dans R. J'ai déjà défini le répertoire de travail dans R.

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

Je suis sûr que c'est une erreur de l'utilisateur, mais qu'est-ce que je fais mal? Cela semble fonctionner initialement, mais renvoie l'erreur suivante. Je pourrais très bien faire quelque chose de mal, mais je crois utiliser les mêmes commandes.

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 

Toute aide que vous pouvez fournir sera appréciée.

18
Btibert3

Vous devez émettre toutes les commandes en un appel system():

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

Vous devriez déjà être dans votre répertoire de travail, donc je ne suis pas sûr que la fonction cd getwd() soit nécessaire. Et vous aurez peut-être besoin de guillemets autour de votre chemin car il contient des espaces. L'erreur peut être résolue en mettant des espaces autour de >.

Si j'étais à votre place, j'essaierais ceci:

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

METTRE À JOUR:

Et vous devriez probablement suivre ce conseil dans la section "Différences entre Unix et Windows" de ?system qui dit que vous devriez utiliser 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.
24
Joshua Ulrich

Par exemple, personne n'a-t-il constaté que system("dir", intern = T), par exemple, ne fonctionne pas, mais que vous avez besoin de system("cmd.exe /c dir", intern = T)? Seul ce dernier fonctionne pour moi. J'ai trouvé ceci sur le site de discussion ici (le post de William Dunlap, à environ un tiers de la descente).

En outre, cela ne fonctionne pas avec la commande "cd", mais vous pouvez utiliser la fonction setwd() dans R et la commande sera exécutée dans ce répertoire.

J'ai créé les fonctions suivantes pour plus de commodité, pour l'exécution de programmes et l'exécution de commandes:

#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)
}
8
CJB

Votre code est-il endommagé lorsque vous obtenez l'erreur 1 ou l'exécution continue-t-elle?

Chaque fois que vous exécutez des commandes système dans une autre langue, il est utile d’imprimer l’appel système avant de l’appeler pour savoir ce qui se passe exactement, ouvrez le shell que vous souhaitez utiliser et recherchez la même erreur. Comme la commande est exécutée correctement, cela pourrait être un problème dans bgame ou R.

Si vous regardez http://astrostatistics.psu.edu/datasets/R/html/base/html/Shell.html vous pouvez voir l’indicateur de variable transmis à l’appel système. "Indiquez au commutateur de lancer une Si Shell est bash ou tcsh, la valeur par défaut devient "-c".

"Le shell à utiliser peut également être modifié en définissant la variable de configuration R_Shell sur une valeur appropriée (chemin complet du shell, par exemple,/usr/local/bin/bash)."

0
kpie