Ich verwende RStudio unter Windows 10. Bitte helfen Sie mir, die Ausgabe der R-Systemfunktion in mein Ausgabedokument aufzunehmen, wenn ich die Markdown-Datei stricke. Ich habe viele Kombinationen von Chunk-Optionen ausprobiert, die ich in der offiziellen Referenz gefunden habe .
In der Konsole die Ausgabe von:
system('java -version')
ist:
Java Version "1.8.0_261"
Java(TM) SE Laufzeitumgebung (Build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (Build 25.261-b12, gemischter Modus)
Wenn ich es jedoch in ein RMardown-Dokument einfüge:
---
title: "Code Chunk Not Displaying Output"
output: html_document
---
```{r test}
system('java -version')
```
Anstatt meine Java-Version anzuzeigen, lautet die formatierte Ausgabe für den Chunk leider:
## [1] 0
system2("java", "-version", stderr = TRUE)
(Wenn Sie sicherstellen möchten, dass jeder aufgerufene Befehl, nicht nur java
, (1) akzeptiert -version
, dass er akzeptiert , und (2) auch hinzufügen stdout = TRUE
. Wenn kein stdout
zu erfassen ist, schadet es nicht.)
Dies ist eine (schnelle) Diskussion über Dateideskriptoren (fd). Wenn ein Programm ausgeführt wird, akzeptiert es möglicherweise Daten (oder etwas) im Dateideskriptor 0, der normalerweise als Standardeingabe oder stdin
. Es kann eine beliebige Anzahl von Dateideskriptoren ausgeben (Text/Werte/Daten senden), aber normalerweise verwenden die meisten Programme mindestens fd1 ( Standardausgabe , stdout
) und oft, aber nicht immer, fd2 ( Standardfehler , stderr
). Der Grund dafür ist, dass Befehlszeilendienstprogramme die beabsichtigte Ausgabe auf stdout
erfassen und Fehler/Warnungen auf erfassen können stderr
. In der Muschelsprache:
# /-- this is redirecting stdout
# | /-- this is redirecting stderr
# v v
$ somecommand -arg1 -arg2 > output.log 2> error.log
Sendet die beabsichtigte (normale) Ausgabe an die Datei output.log
und alles, was nicht dem Standard entspricht (oder außerhalb des Bandes oder Warnungen oder Debugging oder ...) an error.log
. In vielen Fällen ist ein Leergut error.log
eine gute Sache und "erwartet".
Während meiner ersten Tests habe ich, da ich kein Java habe, verwendet ls --version
und /bin/ls
sendet seine Versionsinformationen an stdout
. Offenbar java
verwendet stderr
.
(Ich habe schließlich mit überprüft, indem ich zu einem Befehl gewechselt habe, stderr
der Folgendes verwenden sollte : Der einfachste Weg, ohne java
herum zu reproduzieren, war:
---
title: "Code Chunk Not Displaying Output"
output: html_document
---
```{r test}
system("ls --versiommmmm", intern = TRUE)
```
die (1) nicht die erwartete ls: unknown option -- versiommmmm
Ausgabe hatte und (2) ## [1] 2
stattdessen zurückgegeben wurde, was einen Exit-Status von 2 anzeigt. (Die meisten Dienstprogramme verwenden einen Exit-Status von 0, um "alles gut" zu bedeuten, und alles andere als Fehler. Einige Dienstprogramme gehen Sie so weit, dass für bestimmte Fehler ein bestimmter Exit-Status ausgegeben wird, aber es ist im Allgemeinen sicher anzunehmen, dass "keine 0
Fehlerbedingung" bedeutet.)
Um R dazu zu bringen, einen Systemaufruf zu tätigen und den stderr abzufangen, habe ich zu gewechselt system2
, wodurch man stderr=
(sowie stdout=
separat) erfassen kann .
Anmerkungen:
system2
nimmt den Befehl zur Ausführung als erstes Argument und dann alle nachfolgenden Argumente als Zeichenvektor, also etwa:
system2("java", c("Echo", "Drink Hot Java"))
würde java
mit zwei Argumenten "Echo"
und der Zeichenfolge aufrufen . (Eigentlich ist das nicht ganz richtig ... siehe den nächsten Aufzählungspunkt.)
beide system
und system2
machen wirklich schlechte Arbeit, Dinge zu zitieren. Wenn eines Ihrer Argumente eingebettete Leerzeichen enthält, wie z. B. der Aufruf im vorherigen Aufzählungszeichen, wird der Befehl tatsächlich als einzelne Argumente angezeigt. Der Befehl des vorherigen Aufzählungszeichens ruft also tatsächlich java
mit vier Argumenten auf und entspricht c("Echo", "Drink", "Hot", "Java")
. (Ich und viele Leute halten dies für ein erhebliches Problem mit system2
. Die Problemumgehungen umfassen die Verwendung von sich shQuote
selbst oder die Verwendung des processx
Pakets, das die Dinge richtig macht .)
verschiedene Argumente, wobei das Äquivalent von system(..., intern=TRUE)
ist system2(..., stdout=TRUE)
... und Sie erhalten die Möglichkeit, stderr=
.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen