2013-07-21 2 views
8

In R capture.output() kann die Ausgabe zu stdout in einem Ausdruck als ein Zeichenvektor, z.B.gibt es eine Möglichkeit, stdout in Julia wie capture.output() in R zu erfassen?

> x = capture.output(print(1:10)) 
> x 
[1] " [1] 1 2 3 4 5 6 7 8 9 10" 

Gibt es eine äquivalente Funktion in Julia?

+0

Was haben Sie versucht? Bei einer Schätzung ändern Sie OUTPUT_STREAM, STDOUT und STDERR in etwas: http://docs.julaulang.org/en/release-0.1/stdlib/base/#io - es gibt IOBuffer, der Ihnen ein Objekt geben kann, das Sie schreiben und lesen können zu ... – Spacedman

+0

... Oder nicht: http://comments.gmane.org/gmane.comp.lang.julia.devel/10794 – Spacedman

+0

'OUTPUT_STREAM' wurde in Julia 0.2 entfernt; Ich habe die Mailing-Liste letzte Nacht gelesen und unter Westleys Pull-Anfrage diskutiert (die vor ein paar Wochen geschlossen wurde) –

Antwort

5

Mit Julia 0.2 gibt es jetzt eine Möglichkeit, die Standardausgabe zu erfassen: Sie können redirect_stdout aufrufen, um STDOUT in eine Pipe umzuwandeln, aus der Sie lesen können.

Dies ist hauptsächlich nützlich, um die Ausgabe von externen C-Bibliotheken zu erfassen. Wie Stefan erwähnte, akzeptieren die meisten Julia-I/O-Funktionen ein io-Argument, das es Ihnen ermöglicht, an ein beliebiges Ziel zu drucken, beispielsweise einen Zeichenfolgenpuffer.

+0

Danke! Dies sieht näher zu capture.output() 'in R. –

4

Standard-Bibliotheksfunktionen sollten alle ein optionales EA-typisiertes erstes Argument akzeptieren, auf das gedruckt wird, wenn es angegeben wird, ansonsten jedoch STDOUT. In diesem Fall können Sie mit sprint(io->f(io,...)) erfassen, was in einer Zeichenfolge gedruckt wird. Wenn die Funktionen nicht zum Drucken auf ein bestimmtes IO-Objekt geschrieben wurden, gibt es keine Möglichkeit, die Ausgabe umzuleiten.

+0

danke! Dein letzter Satz erklärt, warum ich diese Frage gestellt habe; mehr unter https://github.com/JuliaLang/julia/pull/3044 –

3

Nicht sicher, was Sie wollen, aber wenn Sie versuchen, knitr zu julia zu bringen, dann genial!

Das Gadfly-Paket hat Webart, die etwas davon tut.

Check out https://github.com/dcjones/Gadfly.jl/blob/master/src/weave.jl#L19

und

https://github.com/dcjones/Gadfly.jl/blob/master/src/weave.jl#L423

Ich habe es in https://github.com/jverzani/Weave.jl mit selbst Grading-Quiz von Abschlag zu machen.

+0

Ich arbeite daran, "Julia" zu "Knitr" zu bringen; der umgekehrte Weg ist viel schwieriger für mich :) Mir war nicht bewusst, dass dies in Gadfly gemacht wurde. Das sieht cool aus! Der Schlüssel scheint also die 'print()' und 'println()' Funktionen in einer Sandbox zu überschreiben. Interessant. Ich denke, das ist was ich will. –

+0

Eine bessere Antwort (könnte kommen) (https://github.com/JuliaLang/julia/pull/3044) in den zukünftigen Versionen von Julia, und diese Antwort ist im Moment zufriedenstellend genug. –