★ 関数の定義をみる方法 ★

8537. 関数の定義をみる方法 波音 2005/12/04 (日) 02:32
└8539. Re: 関数の定義をみる方法 aa 2005/12/04 (日) 04:41
 └8542. Re^2: 関数の定義をみる方法 波音 2005/12/04 (日) 11:22
  └8543. Re^3: 関数の定義をみる方法 青木繁伸 2005/12/04 (日) 13:10
   └8544. Re^4: 関数の定義をみる方法 青木繁伸 2005/12/04 (日) 13:26
    └8548. Re^5: 関数の定義をみる方法 波音 2005/12/04 (日) 15:48


8537. 関数の定義をみる方法 波音  2005/12/04 (日) 02:32
例えばRで

>myfunction

と打ち込めば関数の定義が見ることができますが,UseMethod(" ")の関数,例えばmeanとかanovaなどといった最初から組み込まれている関数の定義をみるにはどうすればよいのでしょうか。

     [このページのトップへ]


8539. Re: 関数の定義をみる方法 aa  2005/12/04 (日) 04:41
The R Tips
http://cwoweb2.bai.ne.jp/~jgb11101/files/bbs/support.html
の「【130頁】関数定義を見る」を参照下さい

     [このページのトップへ]


8542. Re^2: 関数の定義をみる方法 波音  2005/12/04 (日) 11:22
回答ありがとうございます。
確かにplotやsdのように関数の定義が表示されるのもあるのですが,以下のように表示されない場合もあるようなのですがこれは見れないということでしょうか。

> anova
function (object, ...)
UseMethod("anova")
<environment: namespace:stats>

> mean
function (x, ...)
UseMethod("mean")
<environment: namespace:base>

     [このページのトップへ]


8543. Re^3: 関数の定義をみる方法 青木繁伸  2005/12/04 (日) 13:10
まず,methods 関数が何を返すものか,メソッドとは何かについて

> methods(mean)
[1] mean.Date mean.POSIXct mean.POSIXlt
[4] mean.data.frame mean.default mean.difftime

平均値を求める関数は,実は mean.default です(多くの場合,foo.default という命名規則に従っていると思います)。

> x <- 1:10
> mean(x)
[1] 5.5
> mean.default(x)
[1] 5.5

関数にもよりますが,mean.default などと入力すると関数定義は見えます。

> mean.default
function (x, trim = 0, na.rm = FALSE, ...)
{
  略
}
<environment: namespace:base>

anova については,anova.default ではなく,

> methods(anova)
[1] anova.glm anova.glmlist anova.lm anova.loess*
[5] anova.mlm anova.nls*

なので,どれについての anova なのかにより,たとえば,
> anova.glm
function (object, ..., dispersion = NULL, test = NULL)
{
  略
}
<environment: namespace:stats>

ですね。

オブジェクトはクラスを持っているので,クラスによって実際に呼び出す関数が決められるのです。そして,上の anova だと anova.glm とか anova.lm があるのです。

     [このページのトップへ]


8544. Re^4: 関数の定義をみる方法 青木繁伸  2005/12/04 (日) 13:26
メソッドのわかりやすい(?)例

my.func に対する,print メソッド
> print.my.func <- function(x) cat(sprintf("ans = %.2f\n", x))

x と y は同じ値を持つが,クラスは違う
> x <- 1.23456
> y <- x
> class(y) <- "my.func"

x は特にクラスを持たない(numeric クラスのみ)ので,print.default 関数でプリントされる
> x
[1] 1.23456
> print(x)
[1] 1.23456

y は my.func クラスなので,print.my.func 関数でプリントされる
> y
ans = 1.23
> print(y)
ans = 1.23

     [このページのトップへ]


8548. Re^5: 関数の定義をみる方法 波音  2005/12/04 (日) 15:48
回答ありがとうございます。

平均を求めるときはクラスに入っている機能を呼び出すような形で算出されていたのですね。定義されている関数をただ使っているだけだと気づきませんが,単純に使えるものほど中身が複雑なものとなっていることを思い知らされました。

     [このページのトップへ]


● 「統計学関連なんでもあり」の過去ログ--- 036 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る