Преобразование вывода на печать в вектор

#r

#r

Вопрос:

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

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

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

Комментарии:

1. Может быть, вы могли бы дать нам лучший обзор того, чего вы пытаетесь достичь. Предложения Андри хороши, но, не зная, что вы пытаетесь сделать, мы могли бы также стрелять в темноту.

Ответ №1:

Вместо того, чтобы использовать 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 .