niszetの日記

細かい情報を載せていくブログ

(R) stylerパッケージでRのコードを整形する時は注意が必要…(日本語含む場合は特に注意->windows版だけ?(追記))→3/4時点で解決していることを確認済

追記。

この記事を書いた当時、1/23ではwindows上でかつファイル中に日本語が含まれている場合には注意が必要だったのですが、内部の依存パッケージencのバージョンアップ(CRAN上では3/3にVersion 0.2.0になっている)に伴い解決したようです。styler自体は更新する必要はないはずで、encだけ更新しても良いかもしれませんが、install.packages("styler")で入れなおしても良いかもしれません。
当時の記録を残すということで記事は残しておきます。
stylerの使い方についてはまた別に記事を書き直します。

yutannihilationさん、encにも…!sugoi

github.com

usethisと一緒に入っていた。

昨年12/11時点でCRANに1.0.0として登録されていたようです。

使い方は下記のstylerの公式サイトを参照するとよさそうです。

Non-Invasive Pretty Printing of R Code • styler

...で終わるのはさみしいので、試しに先のページにあるコードを実行してみると、

ugly_code <- "a<-function( x){1+1}           "
style_text(ugly_code)
#> a <- function(x) {
#>   1 + 1
#> }

確かになりました1! これは下記の記事のリンクにある、

The tidyverse style guide style.tidyverse.org

2.2 Spacing のルールに沿ってますね2

  • = の前後に1文字の空白を入れる
  • 中置(infix)演算子も空白で囲われるべき。
  • ただし^, :, ::, :::については除く
  • ,のあとには常に空白を入れる。,の前には入れない(英語と同じ)
  • イレギュラーな空白の代わりに()で優先順位を強調する
  • 関数呼び出しの一部でない場合は(の前に空白を入れる
  • <- や = を揃えるために、追加で空白を入れてもよい。
  • ()や[]の中には空白をいれない。,の場合は直後に空白を入れるルールはそのまま残る

などなど。

で、こうなってくると気になるのは日本語対応ですよ。
適当なプロジェクトにtest.rというファイルをつくり、適当に下記を入力して保存します。

a<-1<-0 ; c =2
# aaaaa



# おおおおおおお



で、styler::style_file("test.r")と書いて実行すると…?

styler::style_file("test.r")
#> Styling  1  files:
#>  test.r i 
#> ----------------------------------------
#> Status   Count   Legend 
#> √  0   File unchanged.
#> i    1   File changed.
#> x    0   Styling threw an eror.
#> ----------------------------------------
#> Please review the changes carefully!

と表示され、実行結果(test.r)の中身は

a <- 1

c <- 2
# aaaaa




あらすっきr…。

oh...

どうやら日本語を含む場合はコメントであっても消えてしまうようです。また、;は許してくれないし、 = は <- に変えられてしまうようですね。
なお、拡張子は.rではなくて.Rが推奨されています。ただしこの関数で名前を変えてくれるわけではないようです(まぁその方が正しそうですけどね)

stylerはカスタマイズ可能なようで、先のgithub.ioのArticlesからCustomizing stylerを選択して、下記を参照してください(私はまだ触ってないので使い方わかりませんが…)

Customizing styler • styler

ただし、説明の最初の方を見るとAST作って云々とあるので、そこで既に日本語が弾かれている可能性があるのでその場合はどうしようもないですね(いずれ見てみますが…)

ということで、sytlerは使用時に注意が必要ですよ、ということでした。

追記

本件、yutannnihilationさんに拾っていただいて、issue建てていただきました。

github.com

どうもやりとりを見る限り、windows限定っぽいです。R、windowsで日本語扱うの苦手過ぎでは…

逆に、R/windows環境を持っている方、開発中/正式リリース直後のパッケージをちょっと触ってみるとパッケージの開発に貢献できるかもしれませんね。
ちょっとこのissue参考に、自分でも報告できるように頑張ります…!

Enjoy!!


  1. そらそうだ。

  2. 以下は適当に私がまとめているものなので原文読みましょう。英語だとa spaceで空白1字と明確になるのは便利だなぁ。下記の訳?では曖昧になってます。

(R) bang operatorの訳って何になる予定ですか? (メモ)

バンバン!!

先日のこの記事 niszet.hatenablog.com

のリンク先の The tidyverse style guide1 の、 style.tidyverse.org

の 5 Tidyeval に

Put a space after the bang operators (!! and !!!) but not before them.

と書いてありまして、!!や!!!はbang operatorsと呼ぶそうです。

そういえばちょっと前に、Hadleyがこんな感じで呟いていまして。これが正式?版となったのかなと。

辞書を引くと、バンという音、轟音、銃声、一撃、強打、などなどの意味が出てきますが、なんかしっくりこないですね…

いずれどこかの文脈で使用されたものが和訳されると思うので、今から待ってます(?)

Enjoy!!


  1. 今読んでるところですが、気になるところから読んでいるのでここまで読み切ったわけではないです。

(R) usethisパッケージ1.2.0 と The tidyverse style guide について (メモ)

パッケージを更新するときはNewsで何が更新されているか見てみるのはおススメです。

deprecated になった関数や、bugfix、追加の関数、関数のオプションなどが書かれていて、一読の価値ありです。

今まで、RStudioのpackageタブからupdateからのSelect AllからのInstall Updatesしていたのですが、いつからか右端のNEWSのリンクから(ファイルがあれば)更新を読むようになりました。おすすめです。

usethisパッケージが1.2.0になった

昨年11月にこのパッケージについて書いているんですが(当時は1.1.0)、これが1/19に更新されたようです。 niszet.hatenablog.com

で、この usethis パッケージのNEWSのリンク(下記)

NEWS

にThe tidyverse style guideなるドキュメントへのリンクが。

style.tidyverse.org

なお上記のNEWSには

use_tidy_style() styles an entire project according to http://style.tidyverse.org (#72, #197 @lorenzwalthert).

とあるので、この関数使うとtidy_styleにしてくれるってことでしょうか…(未確認)

usethisパッケージ、tidy style guideともに要確認ですね…

とりあえず忘れないように速報的なメモ記事です。

以上。

Enjoy!!

B. P. Lathiの Signal Processing And Linear Systemsで状態空間表現について学ぶ

量が多いので複数回に分ける。

時系列の解析をしたい。そのためには状態空間モデルについて避けることができない。しかし、状態モデルと観測モデルの式の形はわかるし、意味もわかったと思ったのに実際に式を追いかけてみるとイマイチ理解ができない。
そんな中でディジタルフィルタについて勉強していると、状態空間による表現があることを知り、そうであればモデルを「推定」するのではなくて回路構造等アーキテクチャがあらかじめ決まっていて、そこには推定すべきあいまいさがない状態で考える方がわかりやすいのではないか…?

…と考えて海外の大学の講義資料等を見て回った結果、B. P. LathiのSignal Processing And Linear Systems という本が良さそうだということで購入して読んでみました。

この日記はその中で得られた理解や問題を解いた結果をペタペタ貼っていこうという話の導入編です。つまりあまり中身がないということです。

購入

USA/Canada以外ではペーパーバック版がお安く買えます。中古で買っても良いのかもですが、著者にお金が入る方が良いなと思って。
なお、この本は800ページにわたって信号処理に関する内容が書かれていて、Sate Space Analysisとして13章に状態空間の話が載っています。ページ数が多くて結構ドン引きしますが、英語がかなり読みやすく、式の変形・展開や事例などを丁寧に解説してあるため、変に省略された本を買うよりもよほどわかりやすいです。amazonなら8kほどで購入できるので1円/ページってことですか。

雑な理解

一通り読み終わって、とりあえず下記のように理解しました。

  • 状態空間の式は1階の微分方程式の行列表現(連立方程式
  • 「状態」は各ノードの値。あるいは「積分器」の前後、あるいは積分器そのものだと考えても良いと思う
  • 離散時間の場合はこれがz^-1なので、実質FF(Flip Flop)
  • 連続時間の場合は受動素子ならLやC。iとvの関係が逆なので、i,vどちらかがもう一方に対して積分する関係として表現できる。RLC回路などは各節点についてi,vを決めるため、どちらも「状態」を保持するための素子として使用できる。
  • 伝達関数による表現は入力から出力に至るものだけ。つまり可観測かつ可制御の状態。
  • 直達項は分子分母が同じ次数だと出現。
  • pole/zeroキャンセルすると見えないものがある(うろおぼえ)
  • ラプラス変換で周波数領域で考えても良いし、時間領域で解いていっても良い(前者の方が解くのは簡単そう)
  • カルマンフィルタはこの本の範囲外だが、入力が存在せず、状態と観測それぞれに誤差項が入ったモノ(ただしそれぞれ独立)と考えると個人的にはすっきりする
    • 観測には必ず誤差が含まれる、ということで観測式の方はその誤差が入った発展版という理解。
    • 状態の方は、系に対して信号として扱えるほどの大きな入力はないが、無数の小さなランダムな入力が入っていてそれがガウシアンノイズっぽく見えているのでは、などと考えるとちょっとすっきりする。
  • こっちのSSは制御のお話なので入力によって制御したいという気持ち。時系列は制御する対象ではないという点(観測したものから”推定”する)
    • "推定"するにはそちらのお作法がある。 この本の外の話なのでこの本では時系列解析自体はわかるようにならない。ただし状態空間表現を学ぶことが出来る
  • あとは行列というか線形代数の話。これも不安があるなら別途勉強するほうが良い。

もうちょっとちゃんと理解したい

ならば私は手を動かすしかないですね。少しずつやっていきます。
また、これとあわせて時系列解析の方もやっています。それらを合わせて考えたときに、上の雑な理解はどう変化しているか。んー、楽しみ()

TokyoR67に行ってきました(一部追記)

行ってきました。

1/22追記:
ATNDの方に資料のリンクが追加されたようなので、そちらを参照すると良いと思います(この記事自体は残しておきます)

前回、資料リンク作らなくても良いかなぁと思ったのですが、Togetter作っておこうかなと思ったら流れでまとめてしまいました。なお、現時点で確認できたものだけ、今後更新するかは不明、です。
なお、前回からATNDにリンクを貼っていただけているので、そちらから見ても良いのかなって思いますが、コレ結構時間かかるので無理ない範囲で…!

ちなみに私は良く参加していますが、運営さんではないRエンジョイおじさんです。
運営さん、いつもお疲れ様です。今回もありがとうございました。

なお、別にtwitter IDと紐づけて発表しなくてはいけないこともないし、発表資料を公開しなくてはならないわけでもないし、配信をしなくてはいけないわけでもないので、発表するの興味はあるけど名前伏せたい…とかも出来ますので、運営さんに聞いてみよう。ATNDの主催者の方に問い合わせるか、r-wakalangのtokyorチャンネルなどからどうぞ。

なお、次回は3/3を予定しているそうですが、場所は未定、発表者も募集中とのことです。我こそは!という方は是非是非!

感想

ここからしばらくはポエムなので読み飛ばしましょう。
2018年、1回目の開催でした。毎回初参加の方がいらっしゃる(それなりの割合で)し、参加される方の分野も色々なので(私が言うのもなんですが...)面白いコミュニティだなーっていつも思っています。

今回はステッカーもいただいたし、次回はLT出来るようにたゆまぬ努力します。

以下、資料まとめ

追記
発表資料については発表者の方の善意で公開されています。「資料を公開したくない」ということも可能ですので、そういう場合は運営さんに相談してみましょう。
また、発表を聞いている私たちは感謝の気持ちを忘れずに。気軽に押せる🍣ボタンとかあれば良いと思うのですが…

ATND

資料のリンクについて、ATNDの方が公式ですので更新されていたらそちらをご参照ください() atnd.org

Togetter

私が個人的にまとめているものです。お気づきの点があればご連絡ください。 togetter.com

r-wakalang

slackにてRについて質問できる場所があります。下記の記事をご参考に。 qiita.com

ツイキャス

当日の様子は配信されることがあります。ありがたいですね。 ただし、必ず配信されるというわけではないので、配信していたら喜びましょう。 twitcasting.tv

TokyoRコミュニティのツイッターアカウント

こちらから。LT希望などもこのアカウントに呟けば拾ってもらえます。
また、当日配信(があれば)のアドレスも呟かれているので、気になる方はこちらもチェック。 twitter.com

会場

会場を貸していただけるってありがたいことだなぁと常々思っているので、リンクを貼ることで多少なりとも宣伝になれば…

www.otto-online.jp

以下、オットージャパンさんのHPトップから引用です。

オットーについて
オットージャパンは、ヨーロッパを中心に世界30カ国で展開するドイツ発の通販企業です。インターナショナルなレディースファッションを中心に高品質の商品を充実したサービスでこれからも皆様にお届けしてまいります。

とのことです。興味がある方はHP下部の採用情報からどうぞ…!とのことでした。

オープニング

前回同様、オープニングにTokyo Rについての説明がありました。
手元のメモによると下記の通り。

niszet メモ

以下は手元にあったメモから。ご参考程度に。

  • 主催者が変わりましたというご案内

    • 主催者変更は前回からですが、しばらくは周知のため告知が続くと思います
  • 連絡はTokyoR Communityアカウント(twitter)によろしくお願いします

    • 公式のアカウントがあるのは良いですね。LT希望等はここへ連絡すればよいという安心感。
  • 今回から追加された(ATND参照)、アンチハラスメントポリシーについての説明。

    • 他人の嫌がることはしちゃダメだよ!という当たり前の話ではありますが、コミュニティとして表明して活動しますよ!というのは心強いですね。ただ、僕の観測範囲でそういうことがあったという認識はないので、安心感がより増しましたよという理解です。
  • 配信についての説明。

    • ツイキャスで配信されたくないという方は運営さんにご連絡を。臨機応変に対応していただけますよ。
  • 次回開催予定の連絡。

    • 次回は3/3に開催予定。場所は未定。発表者も募集中。とのこと。皆さま、是非ッ

初心者セッション

初心者セッション1

初心者セッション 1 データ読み込み編
github.com

初心者セッション2

Beginner's Session2 --data manipulation--
speakerdeck.com

初心者セッション3

Rでデータを可視化する

www.slideshare.net

応用セッション

応用セッション1

RからGoogleCloudVisionAPI を使う

www.slideshare.net

niszet メモ

以下は手元にあったメモから。ちゃんとキャッチできているかはわかりませんのでご参考程度に。「これ違くない?」とかあったら教えていただければありがたいです~

  • マクドナルドは場所わかる?

    • 指定してないが、難しいかなという
  • 歪みとかが影響している?

    • あるっぽい
  • ロゴは登録してあるものは??

    • ちょっと良く分からない。ためしてみる
  • Web検出とは?

    • 本体にはあるけど、このパッケージにはなかった。pythonはあったけど、Rのサンプルコードはなかった。
  • レスポンスは?

    • 1秒以下とかで、軽い
  • 顔検出、個数以外、何か見れる?表情とか。

    • サンプルだと男女、笑顔かどうかとか。
  • お値段は?

    • 1000unitまで無料、1000unitあたりいくら。顔で1unit、・・・という感じ。
  • ebiイメージとは?

    • vertexを描画に使う。今回は使ってない
  • ロゴはまとまったやつを投げたところ8個かえってきた。

    • 画像を分割して投げたらそれぞれで返ってくるかも。

しゅくだいのかいとう

応用セッション2

機械学習と解釈可能性

speakerdeck.com

niszet メモ

以下は手元にあったメモから。ちゃんとキャッチできているかはわかりませんのでご参考程度に。「これ違くない?」とかあったら教えていただければありがたいです~

  • 回帰した時に、1番目と1000番目で重要度が変わっている場合は難しい?

    • 単調なケースはグローバル、凄い複雑だとローカルがよいか。
  • マルチクラスの分類は1:1? *1:rest になっている。

応用セッション3

パイプ演算子自作入門
パイプ演算子 自作入門

niszet メモ

以下は手元にあったメモから。ちゃんとキャッチできているかはわかりませんのでご参考程度に。「これ違くない?」とかあったら教えていただければありがたいです~

  • pipeで.を使うところで、渡す先に関数をネストしたときに.だと評価できない。

    • pipe使ったことがないので。。
  • 柔軟性を感じる。いつ追加されたのだろう?

    • Rの歴史に詳しくないので…
    • schemeを参考にしているらしい。lisprubyなど

LT

LT0

ランダムフォレストを使って探索的データ分析

speakerdeck.com

LT1

Apache Arrowから取り残されるR

speakerdeck.com

LT2

R Shiny 100本ノックの進捗

www.slideshare.net

LT3

佐渡島を見積もる

github.com

speakerdeck.com

LT4

vcdで日本語(3) long format が旧世界とのGateway

www.slideshare.net

LT5

森を見て枝を矯める

www.slideshare.net

補足記事があるそうです。実際の分析手順にご関心のある方はどうぞとのこ

kato-kohaku-0.hatenablog.com

元ツイートはこちらを参照しています。

LT6

R MarkdownPythonを書く
RPubs - R MarkdownでPythonを書こう

アナログRF CMOS集積回路設計[応用編] 5章を読む (前半)

1章はどうした…

niszet.hatenablog.com

例のように備忘録的メモ。

5章はICの構造の話で、5.1 CMOS回路の構造と5.2 半導体パッケージに分かれている。

  • 5.1.1 CMOS回路の構造 さほど枯れてもなく、先端でもない(といってもこの本が出たのがずいぶん前)ときの話かしら。
    マスクとレチクルの話、縮小光学系をレチクル、等倍はマスクと言われるという話は割と最近意識するようになりました。まぁあまり気にする必要もないのですが。

トリプルウェル構造の話、DNW(Deep Nwell)に囲われたp領域、RWと略しますがレトログレードウェル(retrograde well)と呼ぶのですね。正式名称知らなかった。実レイアウトではDNW/NWellでの囲い損ねに注意。Wellは界面に容量があるのでAC成分が抜ける点は注意(書かれている通り)

  • 5.1.2 配線 式(5.1)は間違いでは。 R=R_s\frac{L}{W} が正しい。配線は長い方が抵抗は高い。
    上層のメタル、グローバル配線が低抵抗ってのはおおむねどのプロセスでもたぶん同じですね。先端ほど顕著かなぁ。
    配線容量の式、参考文献3をいつか読もう。まぁ5.1.3にもあるとおり、LPE(Layout Parasitic Extraction)で抽出することが必要ですが、初期見積もりが簡易的に出来るならそれに越したことはない。

  • 5.1.3 ゲートフィンガー構造 fingerといえばLOD(Length of Diffusion)を気にしてしまいますが…。
    Lossを気にする場合、gate抵抗の低減、Cggの低減が必須なので、コンパクトに作るのは大事ですね。RFならなおさらなのでしょうね

先端プロセスだと単純に配線幅(とピッチ)が細く狭いので抵抗が高い。材料的にも既にCuを使用しているので下げようがないので、先端に行くほど寄生成分を気にする必要があるので注意。

5.1.4 ガードリング 大事です。囲いましょう。
囲いましょう。

5.1.5 静電気放電と保護回路 ESD(Electro-static discharge)、大切ですね。ざっくりとは言え、破壊モードのはなし、保護の基本的な方針と回路構成がコンパクトにまとまっていて読みやすい。
これだけで一日語れる話なので深追いしない。

5.1.6 PAD PADの話。基板抵抗による電力損失についてはラザビーの方のRFにも載っていた気がしますね。 Bonding構造次第で取れる構造が変わるので地味とは言えあらかじめ把握しておかねばならない。

5.1.7 LSIの信頼性 グラウンドバウンス-> ノイズの問題の話かと思ったらEMIの話でした。EMIも奥が深いですが、基本はループを小さくですね。大体どの本読んでも書いてあるはず。和訳されたものもあったはず。読みましょう。私は読んでない。

アンテナ効果、図5.11のように、上層に持ち上げてから解決する方法もありですが、理想的には直近で拡散層に接続したいところですね(まぁ全部は無理なのでこの方法は知っておくと良い)

エレクトロマイグレーション、EM。電流密度が上がっていく先端プロセスほど問題になりやすい。丸善のプロセスマイグレーションの説明がわかりやすかった記憶がある。

ダミーメタル。CMP(Chemical Mechanical Polishing)の平坦性確保のために必要。ただ、ダミーメタルは寄生容量や渦電流による抵抗増大、インダクタンス減少などを引き起こすのでこれもあらかじめ考慮しておくと良い(無茶言うなぁ)

5.1.8 スクライブライン オリフラ(オリエンテーションフラット)、12"だとノッチの方が一般的なんですね。

という感じでざっと読みましたが、こういう「回路設計のメインの話ではないが、それぞれが要素として存在していて、押さえておくとよい話」が書かれているのは大事ですね。
それぞれの項目についてより深く調べるなら別の本か詳しい人に聞く、かな。

それぞれ読んだことのある本があるはずなので、思い出したら備忘録として、また別に記事にしますかねー。

5.2はまた気が向いたときに。

(メモ) Rでmatrix(行列)の足し算では気を付ける

背景

MATLABで書かれたコードを、Rに移植したい。
しかし機能的に互換1なコードをRでまっさらから書くのはしんどい。
そうだ、pracma, signal, controlパッケージなどがあるじゃないか

niszet.hatenablog.com

うまくいかない…原因は行列の足し算にあった。

具体例

Rは要素数が1でもベクトル。ベクトルの足し算はリサイクル規則が働くので2つ目の例のように各要素に足される。
しかし行列はリサイクル規則が働かない。3番目のコードのように。
1行1列だって例外ではないのだ。4番目のコードのように。

# 行列
matrix(1:8,2,4)
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    3    5    7
#> [2,]    2    4    6    8

# 行列にスカr...ベクトルを足す
matrix(1:8,2,4)+1
#>      [,1] [,2] [,3] [,4]
#> [1,]    2    4    6    8
#> [2,]    3    5    7    9

# 列数があわないので足せない
matrix(1:8,2,4)+matrix(1:4,2,2)
#> Error in matrix(1:8, 2, 4) + matrix(1:4, 2, 2) : non-conformable arrays

# こっちも
matrix(1:8,2,4)+matrix(1,1,1)
#> Error in matrix(1:8, 2, 4) + matrix(1, 1, 1) : non-conformable arrays

カルマンフィルタのMATLABで書かれたコードを、pracmaなどのパッケージの関数に置き換えてみたところ、これは常に行列を返すようで上記4のようなことが起こったのでした。
as.vectorでmatrix(1,1,1)を変換すると下記の通り。

matrix(1,1,1)
#>      [,1]
#> [1,]    1
as.vector(matrix(1,1,1))
#> [1] 1
str(matrix(1,1,1))
#>  num [1, 1] 1
str(as.vector(matrix(1,1,1)))
#>  num 1
matrix(1,1,1)
#>      [,1]
#> [1,]    1
as.vector(matrix(1,1,1))
#> [1] 1
str(matrix(1,1,1))
#>  num [1, 1] 1
str(as.vector(matrix(1,1,1)))
#>  num 1
class(matrix(1,1,1))
#> [1] "matrix"
class(as.vector(matrix(1,1,1)))
#> [1] "numeric"
typeof(matrix(1,1,1))
#> [1] "double"
typeof(as.vector(matrix(1,1,1)))
#> [1] "double"

is.vector(matrix(1,1,1))
#> [1] FALSE
is.vector(as.vector(matrix(1,1,1)))
#> [1] TRUE

is.matrix(matrix(1,1,1))
#> [1] TRUE
is.matrix(as.vector(matrix(1,1,1)))
#> [1] FALSE

後ろの方は蛇足ですが…。

MATLABのコードはおとなしくMATLAB上で動かすことにします2

なお、昨今の記事はreprex::reprex()を使用して整形していますが、エラーが出る箇所については基本的にはNAが返ってきています。それらの行だけは通常のコンソールに打ち込んで出てきた文字列を加工しています

Enjoy!!


  1. 互換というか、同じ動きをしてくれれば良いのです

  2. なぜはじめからそうしようとしないのか。いつもお前はそうだ