Warum zeigt RMarkdown keine Codeausgabe an?

Nathan T Alexander

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
r2evans

Verwenden Sie vorne:

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 stdoutzu erfassen ist, schadet es nicht.)

Wieso den?

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 stdouterfassen 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.logund 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.logeine gute Sache und "erwartet".

Während meiner ersten Tests habe ich, da ich kein Java habe, verwendet ls --versionund /bin/lssendet seine Versionsinformationen an stdout. Offenbar javaverwendet stderr.

(Ich habe schließlich mit überprüft, indem ich zu einem Befehl gewechselt habe, stderrder Folgendes verwenden sollte : Der einfachste Weg, ohne javaherum 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 -- versiommmmmAusgabe hatte und (2) ## [1] 2stattdessen 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 0Fehlerbedingung" 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 javamit zwei Argumenten "Echo"und der Zeichenfolge aufrufen . (Eigentlich ist das nicht ganz richtig ... siehe den nächsten Aufzählungspunkt.)

  • beide systemund system2machen 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 javamit 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 shQuoteselbst oder die Verwendung des processxPakets, 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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

heißlabel

Archiv