Подтвердить что ты не робот

В R, можно ли остановить печать (cat ( ")) от возврата NULL? и почему cat (" foo") возвращает foo>

Если я введу

print(cat(""))

Я получаю

NULL

Я хочу использовать cat() для печати прогресса R script, но я не понимаю, почему он возвращает NULL в конце всех моих конкатенированных строк, и что более важно, как заставить его остановиться?

4b9b3361

Ответ 1

Все ваши ответы приведены в документации для ?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").

Ответ 2

У меня была такая же проблема. В двух словах, cat() немного неудобен под R. Вы не вдавались в подробности о том, как вы пытаетесь использовать cat(), но я бы предложил посмотреть на paste().

? Паста

Я думаю, это может быть то, что вы ищете.

Ответ 3

Для этого я часто использую 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

Ответ 4

NULL - это возвращаемое значение "cat()". Если вы опустите внешний "print()", вы не увидите NULL.

Ответ 5

Я не вижу необходимости использовать print(cat()). Для печати сообщения cat() уже достаточно. Это может быть то, что вы ищете:

  for (j in 1:n) {
     cat("Running loop", j, "of", n, "\n")
  }