2013-02-23 2 views
3

Я работаю над довольно амбициозной функцией, которую, надеюсь, могут использовать люди, кроме меня, когда я закончу. Когда я просто использую функцию, я могу жить с выходом, вроде как хромой, но что, если мне нужен какой-то красивый внешний вид? То, что я ищу в основном это:Создание приятного вывода

  • Способ печати что-то читаемый на консоль
  • Будучи в состоянии получить доступ, что напечатано

Более конкретно, давайте предположим, что у меня есть три скалярных объекты Я хочу напечатать: stat, dfree и pval. В настоящее время, как я делаю это:

result <- list(statistic = stat, degrees = dfree, p.value = pval) 
return(result) 

Таким образом я могу получить доступ к этим значения, выполнив, например (функция называется whites.htest):

whites.htest$p.value 

Он работает, но выход вид уродливого.

> whites.htest(var.modell) 
$statistic 
[1] 36.47768 

$degrees 
[1] 30 

$p.value 
[1] 0.1928523 

Если мы запустим простую модель VAR так:

> library(vars) 
> data <- matrix(rnorm(200), ncol = 2) 
> VAR(data, p = 2, type = "trend") 

VAR Estimation Results: 
======================= 

Estimated coefficients for equation y1: 
======================================= 
Call: 
y1 = y1.l1 + y2.l1 + y1.l2 + y2.l2 + trend 

     y1.l1  y2.l1  y1.l2  y2.l2  trend 
-0.090102007 -0.060138062 0.126250484 0.014423006 0.003138521 


Estimated coefficients for equation y2: 
======================================= 
Call: 
y2 = y1.l1 + y2.l1 + y1.l2 + y2.l2 + trend 

     y1.l1  y2.l1  y1.l2  y2.l2  trend 
0.040118527 0.018274399 -0.132943318 -0.031235939 0.003242241 

Выходной выглядит очень хорошо. Я просмотрел базовый код для него (просто запустив VAR), но я не могу найти то, что делает его таким же хорошим.

Итак, мой вопрос: как мне напечатать что-то приятное и читаемое на консоли, все еще имея доступ к отдельным объектам (т. Е. Результатам) из функции?

+0

Я не вижу, что уродливо о вашем выходе. Вы сравниваете две совершенно разные вещи. Если вы дадите пример того, что вам действительно нужно, ваш результат будет иметь, включая выборочные данные, вы, вероятно, получите лучшие ответы. – N8TRO

ответ

5

Один из способов я мог думать, чтобы приукрасить вход (и получить больший контроль, если вы пишете больше функций) является создание класса и изменить метод show .. Что-то вроде этого:

# set your class name and its representation is list here. 
setClass("stat_test", representation("list")) 


# show method (here's how the output would be printed 
# you can format to whatever you want... to show and how to show 
setMethod("show", "stat_test", function(object) { 
    cat("object of", class(object), "\n") 
    cat("Estimated Coefficients\n") 
    cat(" statistics\t\t\tdegrees\t\t\tp.value\n") 
    cat(" ", object$statistics, "\t\t\t", object$degrees, "\t\t\t", object$p.value,"\n") 
}) 


# now your actual function (here dummy of course) 
my_fun <- function(x) { 
    t <- list(statistics=1.5, degrees=30, p.value=1e-2) 
    new("stat_test", t) 
} 

# now calling 
w <- my_fun(2) 
> w # you get 

object of stat_test 
Estimated Coefficients 
    statistics   degrees   p.value 
    1.5   30    0.01 

Вы должны позаботиться о выравниваниях курса. Но это одна основная идея.

+1

Потрясающе! Большое спасибо, это идеальный базовый код для начала, а затем расширения. Brilliant :) – hejseb

4

Вы должны дать свой результат классу, скажем «resclass» и создать функцию print.resclass. print является общей функцией и будет искать функциональное пространство для print.resclass и применять его к вашему объекту. Вы можете либо вернуть метод печати NULL, либо вернуть значение объекта невидимо. Обычный способ сделать это - повторные вызовы на cat. Я вижу, что Арун уже представил пример. Вы всегда можете узнать у вас авторов пакетов. Вот print.varest функция, которую вы восхищались:

vars:::print.varest 
#--------------- 
function (x, digits = max(3, getOption("digits") - 3), ...) 
{ 
    dim <- length(x$varresult) 
    names <- colnames(x$y) 
    text1 <- "VAR Estimation Results:" 
    cat(paste("\n", text1, "\n", sep = "")) 
    row <- paste(rep("=", nchar(text1)), collapse = "") 
    cat(row, "\n") 
    cat("\n") 
    for (i in 1:dim) { 
     result <- coef(x$varresult[[i]]) 
     text1 <- paste("Estimated coefficients for equation ", 
      names[i], ":", sep = "") 
     cat(text1, "\n") 
     row <- paste(rep("=", nchar(text1)), collapse = "") 
     cat(row, "\n") 
     text2 <- paste("Call:\n", names[i], " = ", paste(names(result), 
      collapse = " + "), sep = "") 
     cat(text2, "\n\n") 
     print(result, ...) 
     cat("\n\n") 
    } 
    invisible(x) 
} 
<environment: namespace:vars> 
+0

Спасибо! Очень полезно. Я думаю, что сейчас понимаю основную идею, поэтому теперь я знаю, с чего начать. – hejseb

1

добавление к @ ответу Dwin .. В

# run your example code 
library(vars) 
data <- matrix(rnorm(200), ncol = 2) 
# store the output of `x` 
x <- VAR(data, p = 2, type = "trend") 

# what kind of object is `x`? 
class(x) 

# look at code that the author of the `vars` 
# package wrote for the print method 
getS3method('print' , 'varest') 

# look at others.. 
getS3method('print' , 'varsum') 

# ..and others 
methods('print') 
+0

Приятно, что это объясняет некоторые (особенно сейчас, когда я действительно могу посмотреть, как создается результат для varest!). Возможно, глупый вопрос, но как создать метод печати для моего нового класса (скажем, «resclass»)? Скажем, я хочу, чтобы он печатал «Это значение p: << p.value идет здесь >>», используя этот способ, а не просто печатать (вставить («Это значение p»: pval, sep знак равно Как мне это сделать? – hejseb

1

Обычная практика состоит в присвоении возвращаемого значения вашей функции, чтобы данный класс (вы выбираете имя класса), то вы создаете печать метод для класса, который будет хорошо форматировать вывод (часто используя cat) и возвращать тот же объект невидимо. Часто также имеется сводный метод и метод print.summary для получения дополнительного вывода.

Другие вещи, которые помогут с приятным, но легким выходом, - вывести на экран в матрицу то, что вы хотите на экране, и дать имена строк и столбцов матрицы, затем распечатать матрицу, а функция print.matrix будет позаботьтесь о том, чтобы подделать вещи хорошо. Некоторые функции объединятся с использованием cat и матрицами печати.

Смежные вопросы