Если я введу
print(cat(""))
Я получаю
NULL
Я хочу использовать cat()
для печати прогресса R script, но я не понимаю, почему он возвращает NULL
в конце всех моих конкатенированных строк, и что более важно, как заставить его остановиться?
Если я введу
print(cat(""))
Я получаю
NULL
Я хочу использовать cat()
для печати прогресса R script, но я не понимаю, почему он возвращает NULL
в конце всех моих конкатенированных строк, и что более важно, как заставить его остановиться?
Все ваши ответы приведены в документации для ?cat
. Части, которые отвечают на ваш конкретный вопрос:
Аргументы:
fill: a logical or (positive) numeric controlling how the output is broken into successive lines. If ‘FALSE’ (default), only newlines created explicitly by ‘"\n"’ are printed. Otherwise, the output is broken into lines with print width equal to the option ‘width’ if ‘fill’ is ‘TRUE’, or the value of ‘fill’ if this is numeric. Non-positive ‘fill’ values are ignored, with a warning.
... и...
Значение:
None (invisible ‘NULL’).
Таким образом, вы не можете остановить print(cat(...))
от возврата NULL
, потому что это возвращает cat
. И вам нужно явно добавить новые строки, такие как cat("foo\n")
.
У меня была такая же проблема. В двух словах, cat() немного неудобен под R. Вы не вдавались в подробности о том, как вы пытаетесь использовать cat(), но я бы предложил посмотреть на paste().
? Паста
Я думаю, это может быть то, что вы ищете.
Для этого я часто использую writeLines()
в сочетании с strwrap()
и paste()
, чтобы комбинировать значение цикла, если я распечатываю информацию о текущей итерации. strwrap()
обрабатывает длинные строки при необходимости, а writeLines()
означает, что мне не нужно запоминать, чтобы добавить "\n"
в конец моих вызовов cat()
.
> writeLines(strwrap("a very very very very long long long long long long long long string, that is too wide for the current pager width"))
a very very very very long long long long long long long long string,
that is too wide for the current pager width
Вот пример использования для распечатки индикатора итерации:
for(i in 1:1000) {
if(isTRUE(all.equal(i %% 100, 0)))
writeLines(strwrap(paste("Iteration", i)))
## do something
}
дает:
> for(i in 1:1000) {
+ if(isTRUE(all.equal(i %% 100, 0)))
+ writeLines(strwrap(paste("Iteration", i)))
+ ## do something
+ }
Iteration 100
Iteration 200
Iteration 300
Iteration 400
Iteration 500
Iteration 600
Iteration 700
Iteration 800
Iteration 900
Iteration 1000
NULL - это возвращаемое значение "cat()". Если вы опустите внешний "print()", вы не увидите NULL.
Я не вижу необходимости использовать print(cat())
. Для печати сообщения cat()
уже достаточно. Это может быть то, что вы ищете:
for (j in 1:n) {
cat("Running loop", j, "of", n, "\n")
}