Захват вывода печати в вектор - PullRequest
1 голос
/ 20 октября 2011

Я хочу записать выходные данные цикла for в вектор, чтобы его можно было построить.Простой пример выглядит следующим образом:

for(i in 3:5) {
    z <- i + 1
    print(z)
}
[1] 4
[1] 5
[1] 6

Как я могу получить выходные данные 4,5,6, чтобы их можно было построить?

1 Ответ

4 голосов
/ 20 октября 2011

Вместо использования петли for и значений печати лучше использовать sapply (или lapply):

sapply(3:5, function(i)i+1)
[1] 4 5 6

Если по какой-то причине вы не можете использовать член семейства apply, вы можете изменить цикл, чтобы присвоить выходное значение вашей функции вектору:

z <- vector("numeric", 3)
for(i in 3:5) { z[i-2] <- i + 1 }
z
[1] 4 5 6

В очень редких случаях может быть полезно фактически захватить вывод print:

z <- vector("numeric", 3)
for(i in 3:5) { z[i-2] <- capture.output(print(i + 1)) }
z
[1] "[1] 4" "[1] 5" "[1] 6"

Но вы заметите, что это захватывает весь вывод print, включая векторную информацию. Вы можете избавиться от этого, используя cat:

z <- vector("numeric", 3)
for(i in 3:5) { z[i-2] <- capture.output(cat(i + 1)) }
z
[1] "4" "5" "6"

Теперь у вас есть символьный вектор, и вам придется выполнить некоторую очистку.

Нижняя строка

Не пытайтесь захватить вывод print в цикле. Используйте sapply или lapply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...