![見出し画像](https://assets.st-note.com/production/uploads/images/56147207/rectangle_large_type_2_ae12570bcc22e01faecc0d282fd108dc.png?width=800)
【プログラミング】Rにまつわる、しょうもない不具合と解決策(初心者向け)
1. はじめに
なんらかのプログラミング言語を使っていると、数多くのエラーが立ちはだかる。しかもそのエラーの多くは、大概は本当にしょうもないことが原因で起こっている。
現実から目を背けてはいけない。いくら恥ずかしくても、初心者のためには赤裸々に失敗した経験を語ることも大切だ。よってこの記事では、そんな失敗談と解決方法を簡単に書き残しておく。
なお、私は Windows しか使ったことがないので、その点はご容赦いただきたい。
2. 失敗の数々
私の経験した限り最もしょうもない不具合は、以下の三つだ。
・起動しない
・library()でエラー, sink()が機能しない
・グラフの重ねがきができない
本当に恥ずかしい経験だが、順番に説明していこう。
2-1. 起動しない
初心者の数パーセントに立ちはだかるであろう最初の壁、「起動しない」。
彼らにまず与えられる助言は「仕様を確認せよ」、つまり自分のパソコンの仕様にふさわしいものが本当にインストールされているのかを確認せよということだ。だがどこをどう見ても問題がなく、ついでにパッケージを調べてもしっかりインストールされている...
私の見出したこの問題の解決策は、ドライブ直下に移すことである。
何をインストールするにしても、デフォルトではドライブ→Program Files→ソフトウェア(Rなど)として少し下流にダウンロードされる。しかし Windows10 などを使っている場合、ドライブ直下でないとセキュリティにはじかれて起動すらしない場合がある。
なので、インストールする場所をドライブ直下、つまり考え得る限り最上流に設定しておくことが望ましいというわけだ。もうインストール済みなら、それをドライブ直下に移せばいい。
この解決策を見つけたのは、Fiji という画像処理ソフトが起動しない原因を探っているときだった。この手の不具合についての議論を発見し、その内容を試したら上手くいった。どこの誰とも知らない方へ、謝謝。
2-2. library(), sink() が機能しない
人によっては「そんなことあるのか!?」と叫びそうな内容だ。library() はパッケージを確認するだけのものだし、sink()は出力先をコマンドライン上に戻すだけのはずだが...
結論から言えば、これはユーザー名が日本語になっているから起こるのだ。つまり、ソフトウェアが日本語に割り振られたコードを認識できず、いわば文字化けした状態で読み取ってしまうということだ。
だからパッケージの場所を探そうにも、ドライブを認識する段階で滞り、出力先を戻そうにも途中で迷子になってしまうわけだ。
これを解決する手っ取り早い方法は、ユーザー名を追加し、以降の動作はその新しい名前で行うことである。詳しい方法は調べればわかると思うので、ここには書かない。ちなみに一番丁寧に説明してくれていたのは、ネット上に落ちてた大学の講義資料だった。
2-3. グラフの重ねがきができない
par(new=T), add=T, lines関数やabline関数...これらすべてが機能しない経験はあるだろうか。
例えば以下のようなお遊びをしてみる。
a <- runif(100)
plot(a)
lines(lowess(a))
一様分布から乱数100個を持ってきて、それがどんな曲線で代表されるのかを見る、ただそれだけだ。
これを実行すると、少なくとも私の場合は必ずエラーを吐く。これで問題ない場合もあるらしいが、バージョンに依るのだろうか? 何はともあれ、これを解決するには以下のようにすればいい。
a <- runif(100)
{plot(a)
lines(lowess(a))}
plot と lines を中括弧でくくっただけだ。要は、スクリプトに書いたものを貼るだけではplot と lines が一回一回実行されてしまうらしい。また、その状態でも後ろに適当なことを書いて実行すれば無理やり重ねることも可能だが、これは外法らしい。
括弧でくくるのが面倒なら、次のように書いてもいいみたいだ。
a <- runif(100)
plot(a) +
lines(lowess(a))
+を付け加えただけだ。なんとも簡単なことだが、私はこのトラブルのせいで
plot.new has not been called yet
というエラーメッセージを数十回見ることになった。par(new=T)やadd=Tについても
{plot(sin)
plot(cos,add=T)}
{plot(sin)
par(new=T)
plot(cos)}
などとすればいい。+でつなげても出来なくはないが、エラーメッセージが出て煩わしいのでおすすめはしない。
3. おわりに
しょうもない事ほど人の時間を奪っていくものだ。今となっては笑い話でも、その中身を共有しておかないと、またどこかで悲しみが生まれる。真剣に悩んでいる人のもとにこの記事が届くことを願うばかりだ。
この記事が気に入ったらサポートをしてみませんか?