Как создать выходные данные в виде списка, которые не отображаются в виде списков, и как напечатать только часть результата

Выводы многих функций входят в структуру списка - например, lm(). В результате вы можете получить отдельный раздел вывода, используя "$" или индексацию в квадратных скобках. Мой вопрос заключается в том, как я могу создать вывод в виде списка, не показывая явно, что это список. Как вы знаете, когда список выводится на экран, обычно в нем указывается имя или индекс подсписка, например:

L1 = list(a=1:3, b=letters[1:3])
L1

$a
[1] 1 2 3

$b
[1] "a" "b" "c"

Однако вывод lm () никогда не показывает различные подсписки, используя "$" и имена подсписков, хотя вы можете извлечь эти подсписки, используя "$" и имена подсписков.

Второй вопрос касается того факта, что выходные данные некоторых функций включают в себя гораздо больше, чем то, что фактически выводится на экран (например, lm(), опять же). Если мы используем str() для подобранной модели, мы увидим целую кучу контента внутри подобранной модели, большая часть которой не напечатана. Как это достигается? Функция печатает что-то и выводит что-то еще (используя invisible()) отдельно, как показано ниже?

foo = function(x){
   result = list(data=x, test.result=t.test(x))
   print(result[[2]])
   invisible(result)
}
foo(1:10)$data

Спасибо!

1 ответ

Решение

Читайте на классах S3. В частности, когда вы вводите только имя объекта в приглашении, R вызывает print, который имеет методы для разных классов.

Взгляни на print.lm чтобы увидеть, как это работает.

> test <- list()
> class(test) <- "myclass"
> print.myclass <- function(x) cat("hi")
> test
hi
Другие вопросы по тегам