2013-05-03 5 views
24

В R, мне интересно, можно ли временно перенаправить вывод консоли на переменную?В R, можно ли перенаправить вывод консоли на переменную?

p.s. Есть несколько примеров в Интернете о том, как использовать sink() для перенаправления вывода в имя файла, но я не могу найти, как перенаправить его в переменную.

p.p.s. Причина, на которой это полезно, на практике заключается в том, что мне нужно распечатать часть консольного вывода по умолчанию из некоторых встроенных функций в R.

+2

Ты далеко, гораздо лучше переписывать функции, а чем пытаться разобрать текст, который они выводят. –

+3

'? Capture.output'? –

+0

@Ari B. Friedman К сожалению, это просто невозможно. В настоящее время все, что я хочу сделать, это отбивать некоторые дополнительные линии, чтобы сжать выход до управляемой длины. – Contango

ответ

23

Я считаю, что results <- capture.output(...) - это то, что вам нужно (т. Е. По умолчанию file=NULL аргумент). sink(textConnection("results")); ...; sink() должен работать как хорошо, но, как ?capture.output говорит capture.output() является:

, связанные с «раковиной» таким же образом, что «с» относится к «присоединить».

... что говорит о том, что capture.output() как правило, будет лучше, так как он более содержал (т.е. вы не должны помнить, чтобы прекратить sink()).

Если вы хотите отправить выход нескольких операторов к переменным вы можете обернуть их в фигурных скобках {}, но если блок является достаточно сложным, было бы лучше использовать sink() (или сделать ваш код более модульным, окружив его в функциях).

+0

Ben, two notes: 1) 'results <- sink()' ничего не сделает - 'sink()' всегда возвращает NULL. 2) Я не согласен с тем, что 'capture.output' лучше, чем' sink' - наоборот, потому что 'sink' допускает, что код не является одним вызовом функции. Пожалуйста, следуйте моему вопросу: http://stackoverflow.com/q/25781458/684229 – TMS

9

Для записи действительно можно хранить stdout в переменной с помощью храпового соединения без вызова capture.output - например. когда вы хотите сохранить как результаты, так и stdout. Пример:

  1. Подготовьте переменный для отведенного выхода R:

    > stdout <- vector('character') 
    > con <- textConnection('stdout', 'wr', local = TRUE) 
    
  2. отвлечение выхода:

    > sink(con) 
    
  3. делать некоторые вещи:

    > 1:10 
    
  4. Конец утечки:

    > sink() 
    
  5. Закрыть временное соединение:

    > close(con) 
    
  6. результаты проверки:

    > stdout 
    [1] " [1] 1 2 3 4 5 6 7 8 9 10" 
    
+0

Хороший ответ, спасибо! – Contango

+0

Это было почти то, что я искал. См. Http://stackoverflow.com/questions/24396806/convert-a-message-to-a-character-vector для того, как захватывать сообщения, сохраняя при этом результаты – Latrunculia

+0

@Latrunculia для этой цели, я предлагаю проверить 'pander :: evals' например, https://cran.rstudio.com/web/packages/pander/vignettes/evals.html – daroczig

Смежные вопросы