2013-07-21 3 views
8

В R, capture.output() может записывать вывод в stdout в выражении в виде символьного вектора, например.Есть ли способ захватить stdout в Julia, как capture.output() в R?

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

Есть ли эквивалентная функция в Джулии?

+0

Что вы пробовали? По предположению вы меняете OUTPUT_STREAM, STDOUT и STDERR на что-то: http://docs.julialang.org/en/release-0.1/stdlib/base/#io - есть IOBuffer, который может дать вам объект, который вы можете писать и читать ... – Spacedman

+0

... Или нет: http://comments.gmane.org/gmane.comp.lang.julia.devel/10794 – Spacedman

+0

'OUTPUT_STREAM' удален в Julia 0.2; Я прочитал список рассылки прошлой ночью и обсуждался по просьбе Westley's pull (который был закрыт несколько недель назад) –

ответ

5

С Julia 0.2 теперь есть способ захвата стандартного вывода: вы можете позвонить redirect_stdout, чтобы конвертировать STDOUT в трубу, которую вы можете прочитать.

Это в основном полезно для захвата вывода из внешних библиотек C. Как отметил Стефан, большинство функций ввода/вывода Julia принимают аргумент io, который позволяет печатать на произвольном месте, например, на строковый буфер.

+0

Спасибо! Это похоже на 'capture.output()' в R. –

4

Стандартные функции библиотеки должны принимать дополнительный IO-типизированный первый аргумент, который будет напечатан, если он указан, но в противном случае по умолчанию будет использоваться STDOUT. В этом случае вы можете использовать sprint(io->f(io,...)) для захвата того, что напечатано в строке. Если функции не были записаны для печати на заданный объект ввода-вывода, то нет способа перенаправить вывод.

+0

спасибо! последнее предложение объясняет, почему я задал этот вопрос; подробнее под https://github.com/JuliaLang/julia/pull/3044 –

3

Не знаете, что вы после, но если вы пытаетесь привести knitr в julia, тогда удивительный!

Пакет Gadfly имеет переплетение, что делает некоторые из этого.

Заканчивать https://github.com/dcjones/Gadfly.jl/blob/master/src/weave.jl#L19

и

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

Я использую его в https://github.com/jverzani/Weave.jl сделать самостоятельно классификации викторины от уценки.

+0

Я работаю над приведением 'julia' в' knitr'; для меня гораздо труднее другой способ :) Я не знал, что это было сделано в Овод. Это выглядит круто! Таким образом, ключ, кажется, переопределяет функции 'print()' и 'println()' в песочнице. Интересно. Наверное, это то, чего я хочу. –

+0

В будущих версиях Julia лучше ответить [может быть] (https://github.com/JuliaLang/julia/pull/3044), и этот ответ на данный момент является достаточно удовлетворительным. –