Перенаправление вывода консоли R не работает (надежно) из вызова функции

Я написал следующий код для перенаправления вывода консоли в текстовый файл. Вывод всех трех команд (dim, str, summary) появляется в текстовом файле, когда я запускаю код в интерактивном режиме. Однако, когда я помещаю код в функцию и интерактивно выполняю вызов функции, появляется только команда str outuput. Это может быть проблема с буферизацией. Какие-либо предложения?

Операционная система: OS X 10.9.5 (Mavericks); R 3.1.1 GUI 1.65 Сборка Mavericks (6784)


Этот код работает ...

con <- file("FileInfoLog.txt")
sink(con, append=TRUE)
sink(con, append=TRUE, type="message")

writeLines("\n\n\n===============================================================\n")
writeLines("Dimensions are ")
dim(db)
writeLines("\n\n\n===============================================================\n")
writeLines("Structure is ")
str(db)
writeLines("\n\n\n===============================================================\n")
writeLines("Summary is ")
summary(db)

# Restore output to console
sink(type="message")
sink() 

Этот код не работает надежно ... в текстовом файле отображается только вывод str ().

getFileInfo <- function(db) {

    con <- file("FileInfoLog.txt")
    sink(con, append=TRUE)
    sink(con, append=TRUE, type="message")

    writeLines("\n\n\n===============================================================\n")
    writeLines("Dimensions are ")
    dim(db)
    writeLines("\n\n\n===============================================================\n")
    writeLines("Structure is ")
    str(db)
    writeLines("\n\n\n===============================================================\n")
    writeLines("Summary is ")
    summary(db)

    # Restore output to console
    sink(type="message")
    sink() 

}

FileInfoLog.txt из кода, который работает ...

===============================================================

Размеры [1] 28947 17

===============================================================

Структура - data.frame: 28947 набл. из 17 переменных: $ store: int 2 2 2 2 2 2 2 2 2 2 ... $ brand: множитель с 3 уровнями "dominicks", "minute.maid", ..: 3 3 3 3 3 3 3 3 3 3 ... $ week: int 40 46 47 48 50 51 52 53 54 57 ... $ logmove: num 9.02 8.72 8.25 8.99 9.09 ... [...]

===============================================================

Резюме: торговая марка недели цена logmove feat AGE60
Мин. : 2,00 доминикс: 9649 мин. : 40,0 мин. : 4.159 Мин. : 0,0000 мин. : 0,520 мин. : 0,05805
1-й квартал: 53,00 мин. Горничная: 9649 1-й квартал: 70.0 1-й квартал: 8.490 1-й квартал:0.0000 1-й квартал: 1,790 1-й квартал:0.12210
Медиана: 86,00 тропикана: 9649 Медиана : 101,0 Медиана: 9,034 Медиана: 0,0000 Медиана: 2,170 Медиана: 0,17065 Среднее значение: 80,88 Среднее значение: 100,5 Среднее значение: 9,168 Среднее значение: 0,2373 Среднее значение: 2,282 Среднее значение: 0,17313 для 3-го квартала: 111,00 3-го кв.: 130,0 3-го кв. .: 9.765 3-е кв .:0.0000 3-е кв.: 2.730 3-е кв .:0.21395
Макс. : 137.00 Макс. : 160,0 Макс. : 13,482 Макс. : 1,0000 Макс. : 3,870 Макс. : 0.30740
[...]


FileInfoLog.txt из кода, который не работает надежно ...

===============================================================

Размеры указаны

===============================================================

Структура - data.frame: 28947 набл. из 17 переменных: $ store: int 2 2 2 2 2 2 2 2 2 2 ... $ brand: множитель с 3 уровнями "dominicks", "minute.maid", ..: 3 3 3 3 3 3 3 3 3 3 ... $ week: int 40 46 47 48 50 51 52 53 54 57 ... $ logmove: num 9.02 8.72 8.25 8.99 9.09 ... [...]

===============================================================

Резюме


person Rick Gregory    schedule 11.01.2015    source источник
comment
размещать только соответствующий код?   -  person HaveNoDisplayName    schedule 11.01.2015
comment
Я подумал, что вывод консоли имеет отношение к вопросу, поэтому включил его. Но я его значительно сократил. Спасибо за замечание.   -  person Rick Gregory    schedule 14.01.2015
comment
: - +1 за ваши усилия   -  person HaveNoDisplayName    schedule 14.01.2015


Ответы (1)


При интерактивном запуске команда print() неявно вызывается для каждого результата. В интерактивном режиме это не так. Вы должны вызвать print() явно. Значит, вам понадобится print(dim(db)).

Функция str() отличается тем, что она создает вывод через cat() и на самом деле ничего не возвращает.

Если вы используете функцию source() для запуска своего сценария, вы можете установить echo=TRUE, чтобы сохранить режим автоматической печати.

Кроме того, вместо того, чтобы возиться с настройкой команд sink() и capture.out() самостоятельно. Вы можете рассмотреть возможность просмотра knitr, чтобы создавать красивые отчеты с помощью кода R.

person MrFlick    schedule 11.01.2015
comment
это работает ... спасибо. Также спасибо за предложение о вязальщике. Я займусь этим. - person Rick Gregory; 14.01.2015