2014-01-07 22 views
6

Ich versuche, einen Shell-Befehl in R zu replizieren und kann nicht herausfinden, wie Befehle zusammen zu string. Das gibt nur den Inhalt des Arbeitsordner (system() aus irgendeinem Grund ausfällt):Mehrere Shell-Befehle in Windows

> shell("dir") 
Volume info .. 
Directory of E:\Documents\R 
contents are listed.. 

können nun versuchen und zu C-Laufwerk zu navigieren und führen dir (ohne die offensichtliche dir C: zu verwenden) ..

> shell("cd C:") 
C:\ 
> shell("dir") 
Volume in drive E is GT 
etc.. 

So scheint es, dass Befehle nicht separat eingegeben werden können, da sich die Shell nicht an das Arbeitsverzeichnis erinnert. So ..

> (cmd = "cd C: 
+ dir") 
[1] "cd C:\ndir" 
> shell(cmd) 
C:\ 

Kein Glück, da die C: Ordner nicht gemeldet werden. Andere Methoden, die ich versucht habe, scheitern ebenfalls. Dankbar für irgendwelche Ideen.

+0

Wie Konrad erwähnt, gibt es bessere Möglichkeiten, den Job in 'R' getan. Verwenden Sie beispielsweise die Funktion 'R'' dir' mit dem angegebenen Pfadnamen. 'dir (Pfad = 'E:/Dokumente/r', Muster = 'was auch immer ...')' –

Antwort

2

Ich bin auf Linux und das funktioniert für mich:

system("cd ..;ls") 

in zum vorherigen Verzeichnis navigieren und ls/dir dort läuft. In Ihrem Fall auf Windows, das offenbar funktioniert:

shell("cd C: & dir") 

oder die Ausgabe als Zeichen Vektor zu erhalten:

shell("cd C: & dir", intern=T) und auf Linux: system("cd ..; ls", intern=T)

+1

Funktioniert dank! 'shell (" cd C: & dir ", intern = T)' um char Vektor zurück zu geben – geotheory

+1

Die Dokumentation besagt ausdrücklich, dass dies unter Windows nicht funktioniert. –

+1

Ja benutze Shell anstelle von System – geotheory

1

Sie wissen nicht, ob das hilft, aber die Befehle an eine Saite kollabiert bei der Verwendung von system Arbeiten auf MacOS

cmds <- c("ls", "cd ..", "ls"); 
system(paste(cmds, collapse=";")) 
+0

Die Dokumentation besagt ausdrücklich, dass dies unter Windows nicht funktioniert. –

+0

@Konrad Rudolph: Ups, sorry, verpasst, dass ... –

4

The documentation erklärt, warum system funktioniert nicht: Es führt den Befehl direkt unter Windows aus, ohne zuerst eine Shell zu erzeugen.

shell (oder besser, system2) ist der Weg zu gehen, aber wie Sie vielleicht bemerkt haben, werden shell immer laichen eine neue Schale, so dass Änderungen an der Umgebung über nicht tragen. system2 funktioniert auch nicht direkt, da es seine Befehle angibt (und somit keine Verkettung von Befehlen zulässt).

Die richtige Lösung ist in diesem Zusammenhang nicht einen Shell-Befehl verwenden, um das Verzeichnis zu wechseln. Verwenden Sie setwd statt:

setwd('C:') 
system2('dir') 

Wenn Sie das Arbeitsverzeichnis nach der Ausführung des Befehls zurücksetzen möchten, verwenden Sie die folgenden Schritte aus:

local({ 
    oldwd = getwd() 
    on.exit(setwd(oldwd)) 
    setwd('C:') 
    system2('dir') 
}) 
+0

Notiert, setwd ist besser. – geotheory

0

Dies ist eine Lösung aus here. Das löste mein Problem in den Fenstern dir Befehl aufrufen:

system("cmd.exe /c dir", intern=TRUE) 
Verwandte Themen