в R, я могу остановить print (cat ("")) от возврата NULL? и почему cat ("foo") возвращает foo> - PullRequest
17 голосов
/ 30 октября 2010

Если я введу

print(cat(""))

Я получаю

NULL

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

Ответы [ 6 ]

13 голосов
/ 30 октября 2010

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

7 голосов
/ 11 апреля 2013

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

7 голосов
/ 30 октября 2010

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

?paste

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

5 голосов
/ 17 февраля 2014

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

  for (j in 1:n) {
     cat("Running loop", j, "of", n, "\n")
  }
4 голосов
/ 30 октября 2010

Для этого я часто использую 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
0 голосов
/ 05 апреля 2018

Если вы хотите присвоить его переменной, для использования в LOOP * apply или function (x), попробуйте это:

x<-eval(paste0(name,".y"))

Имя - это переменная, ".y" добавляет к ней строку, вставляет говорит, что печатает, eval оценивает печать, <- присваивает ее переменной, а ax это та переменная. </p>

...