niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) approxfun 便利だけど、どこに値を隠し持っているのか気になったので調べたメモ

Rで統計以外の計算の情報があまり見つからない気がする…

なんらかの理由によって測定値がなかったりして、付近の値で代用する際などに便利なapproxfun()について、使い方をteramonagiさんのブログで覚えたのですが、

d.hatena.ne.jp

このapproxfun()関数自体は戻り値として関数を返してくるんだけど、一体どこにデータを隠し持ってるんだ…?と思って調べてみたのです。 結果としては環境オブジェクト中に隠し持っていました(別に隠してはいない)

# 毎度おなじみのiris
head(iris$Sepal.Length)
#> [1] 5.1 4.9 4.7 4.6 5.0 5.4

# approxfunに与えると関数が返ってくる。
approxfun(iris$Sepal.Length)
#> function (v) 
#> .approxfun(x, y, v, method, yleft, yright, f)
#> <bytecode: 0x0000000015abe7d8>
#> <environment: 0x00000000080519e0>

# 値をあたえる。1番目の値が返ってくる。
approxfun(iris$Sepal.Length)(1)
#> [1] 5.1

# 補間される。1.2番目相当の値
approxfun(iris$Sepal.Length)(1.2)
#> [1] 5.06

# ちょうど1番目と2番目のまんなかの値
approxfun(iris$Sepal.Length)(1.5)
#> [1] 5

さて、この関数の返却値の関数を直接見てもどこにデータがあるかわかりませんが、先にprintしたときにenvironmentが表示されていますね。これを確認します。つまりこんな感じ。

View(environment(approxfun(iris$Sepal.Length)))

で、こんな感じ

f:id:niszet:20180329080243p:plain

ちゃんとデータが入っていますね。この環境中にデータを保持しているようなので、この生成された関数を他の変数に代入するなどして持っておけば、元になったデータ自体をrm()で削除しても大丈夫そう(一応動いた)です。この環境の値は(iris$Sepal.Lengthのコピーということなのでしょう{^1]。

これで安心してapproxfun()が使えるぞい…!

Enjoy!!