4

私は非常に野心的な機能に取り組んできました。完成したら、私以外の人が使用できることを願っています。関数を使用するのが私だけの場合、出力が不自由になっても問題ありませんが、見栄えの良い出力が必要な場合はどうすればよいでしょうか? 私が探しているのは、本質的にこれです:

  • コンソールに読み取り可能なものを出力する方法
  • 印刷されたものにアクセスできること

より具体的には、出力したい 3 つのスカラー オブジェクトがあると仮定しましょう: statdfreeおよび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)見てきましたが、このように見える理由がわかりません。

だから私の質問は、関数から個々のオブジェクト (つまり結果) にアクセスしながら、コンソールに読みやすいものを出力するにはどうすればよいかということです。

4

4 に答える 4

6

入力をきれいにする (そして、より多くの関数を記述している場合はより多くの制御を得る) ために私が考えることができる 1 つの方法は、クラスを作成して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 つの基本的な考え方です。

于 2013-02-23T23:11:05.783 に答える
4

結果にクラスを与え、「resclass」と言ってprint.resclass関数を作成する必要があります。print関数空間を検索print.resclassしてオブジェクトに適用する汎用関数です。print メソッドが 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>
于 2013-02-23T23:08:22.220 に答える
1

通常の方法は、関数からの戻り値を特定のクラスに割り当てることです (クラスの名前を選択します)。次に、出力を適切にフォーマットするクラスの print メソッドを作成し (多くの場合 を使用cat)、同じものを返します。目に見えないオブジェクト。多くの場合、追加の出力を提供するための summary メソッドと print.summary メソッドもあります。

素敵だが簡単な出力に役立つその他のことは、画面に表示したいものをマトリックスに配置し、マトリックスの行名と列名を付けてから、マトリックスを出力すると、print.matrix 関数がライニングを処理します。うまくいきます。cat一部の関数は、行列の使用と印刷を組み合わせます。

于 2013-02-23T23:13:19.573 に答える
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' )
于 2013-02-23T23:11:13.210 に答える