裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

パイプって,便利なの?

2022年01月01日 | ブログラミング

関数のネスト表示 a(b(c(d(x)))) が醜いというので x |> D |> C |> B |> A としましょう!ということである。もともとの関数 a, b, c, d はそのままでも良いこともあるが,パイプで受け渡されるデータが第一引数でなければならないという制約で,A, B, C, D という亜型関数が必要になる。ユーザ側で定義することもできるが,胴元は自分の好きなように関数をつくることができる。一般ユーザはそれを使わざるを得ない。

例えば,

1 F T T F F F F F F F T 
2 F T F F F F F F F F T 
3 F F F T F T T F F T F 
4 F F T F F F F T F F F 
5 F F F F F F F F F F F 
  :

のようなデータを読んで,

11×11 Matrix{Int64}:
   0  59  62   86  61   86   89   84  56  145   82
  59   0  33   55  41   52   47   49  42   48   54
  62  33   0   44  31   51   45   46  35   56   56
  86  55  44    0  73  173  167   97  63   89   71
  61  41  31   73   0   75   60   54  42   63   54
  86  52  51  173  75    0  170   71  54   90   66
  89  47  45  167  60  170    0   77  45   85   64
  84  49  46   97  54   71   77    0  60   78  144
  56  42  35   63  42   54   45   60   0   52   52
 145  48  56   89  63   90   85   78  52    0   86
  82  54  56   71  54   66   64  144  52   86    0

のような集計表をつくる。

具体的には,ファイルの1列目を除いて,読み込んだデータを x として行列乗算 x' * x を計算し,対角成分を 0 にする。だけの話だ。

これをパイプを使って書くためには,余分な関数を定義しないといけない(のだろうなあ)。

Matrix はすでにあるものを使える。
x' * x は単純な処理だが,関数にしないといけない。
同じく,対角成分を 0 にするだけのくだらない関数を書かないといけない。

using CSV, DataFrames

matmul(x) = x' * x
function diag_zero(x)
    for i in 1:size(x, 1)
        x[i, i] = 0
    end
    x
end 

出来上がったパイプは,こうだ。

x = CSV.read("sampledatacross2.csv", DataFrame, truestrings=["T"], falsestrings=["F"], drop=[1]) |> Matrix |> matmul |> diag_zero

どこがわかりやすい?
余分な関数定義は自分で定義するか,誰かに頼んで,定義しなくても使えるようにしてもらうしかない。

必要な関数はどんどん増える(いちいち定義しなくてはならないかもしれないのだ)。

コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« tidyverse の弊害 | トップ | 算額--2022年 »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
Unknown (Yamada)
2022-06-18 02:14:46
Juliaのパイプに制約があるのは確かですが,関数のネストに比べて見通しが良くなりやすいので私は好きです.

複数の引数を取る関数aが元々定義されているなら無名関数(x -> a(x, n))をパイプに入れればいいですし,matmulも(x -> x'x) とすればまだ私は許容できます.

提示されてる例を関数のネストで行うとそれこそ訳がわからなくなりますし,それは一時変数を使うなどして処理を分けるべきでしょう
返信する

コメントを投稿

ブログラミング」カテゴリの最新記事