忍者ブログ
[3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]

DATE : 2024/04/26 (Fri)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


DATE : 2008/03/14 (Fri)

データフレームから条件式が成り立つ行のみを抽出する subset という関数があります。例えば、result データフレームの「x」という列の値が0を超える行のみを抽出するには、次のようなコードを実行します。(「>」や「+」はプロンプトです)

> subset(result, 0 < x)

通常、データフレームの列にアクセスするには、「result$x」とするか、「result['x']」としなければなりません。ただ単に x と書いても、x という名前のオブジェクトが参照されるだけです。ところが、subset 関数の場合は、条件式に当たる部分では自動的にデータフレームのオブジェクトを補ってくれます。そのため、subset 関数の条件式の部分では、ただ単に列名のみを書くだけで十分です。

このような subset 関数を R で直接実行する分には、なんの問題もありません。ところが、あるとき subset を内部で使う関数を書いていたときに、はたと困ってしまいました。条件式の渡し方が分からなかったのです。例えば、次のような関数を実行しようとしても、失敗してしまいます。

> subset_function <- function(condition) {
+     subset(result, condition)
+ }

> subset_function(0 < x) 
 以下にエラー eval(expr, envir, enclos) :  オブジェクト "x" は存在しません 

R では、式は必要になるまで評価されません。そのため、subset_function に渡した条件式は評価されずに関数内部に入ります(遅延評価)。ところが、関数内部の subset の部分で評価が失敗しているようです。

しばらく悩んだところ、次のような解決策が思い浮かびました。

> subset_function <- function(condition) {
+     subset(result, eval(condition))
+ }

> subset_function(expression(0 < x))

式表現を渡して、subset のところで評価するという方法です。ところが、いまひとつスマートではありません。実際、subset 関数は expression 関数を使用せずに式を評価できています。

そこで、R 2.6.2 のソースコードから、subset 関数を定義している部分(src/library/base/R/frametools.R)を調べてみました。条件式の評価に関わる部分のみを抜き出すと、次のようになります。「(...)」は省略を表します。

subset.data.frame <- function (x, subset, select, drop = FALSE, ...)
{
    (...)
    e <- substitute(subset)
    r <- eval(e, x, parent.frame())
    (...)
}

subset 関数の定義を診ると、条件式(subset)は、substitute 関数に渡され、その結果が eval 関数に渡されています。まず、substitute 関数によって式を解析木オブジェクトに変換しています。そして、eval 関数によって、その解析木を渡されたデータフレームの環境で、そのデータフレームは親の呼び出しスタックから取得するという処理になっています。eval の引数は少々分かりづらかったのですが、引数として渡されたデータフレームに対して評価を行う際の書き方であると、eval 関数のヘルプに書かれていました。subset_function は、引数でデータフレームを受け取ってはいませんが、親の呼び出しスタックにあるデータフレームを関数内で直接使っています。そのため、データフレームの取得に親の呼び出しスタックを使用しています。

subset 関数の定義が上のようになっていたので、subset_function も次のように書き直せます。

> subset_function <- function(condition) {
+     e <- substitute(condition)
+     r <- eval(e, result, parent.frame())
+     subset(result, r)
+ }

> subset_function(0 < x)

このようにすることで、条件式をそのまま使用できるようになりました。

注意

上の関数の内容を、以下のように1行にまとめた場合はうまく動作しません。

> subset_function <- function(condition) {
+     subset(result, eval(substitute(condition), result, parent.frame()))
+ }

subset 関数の引数となる eval 関数や、その引数となる substitute 関数は、遅延評価のために、その関数の実行される呼び出しスタックが、subset 関数以下になります。そのため、result のある呼び出しスタックがうまく呼び出せずに失敗するようです。

PR

DATE : 2008/03/06 (Thu)

今日、書店をふと覗いてみると、分厚い専門書が一冊平積みされていました。少々高い本だったので、その時は少し立ち読みしただけで書店を出たのですが、後で名著と呼ばれている本だったことに気づいてきびすを返しました。本当は Amazon で買うつもりだったのですが、その書店では Amazon よりも安く買えることを思い出したので、かなり慌てて引き返しました。

その本とは、「ヘネシー&パターソン コンピュータアーキテクチャ 定量的アプローチ 第4版」です。この本は、「パターソン&ヘネシー コンピュータの構成と設計 第3版」の上級編に相当する本で、ハードウェア方面について詳細に書かれているそうです。

元々、「コンピュータの構成と設計」の方は読んでいて、「コンピュータアーキテクチャ」の方も気になってはいました。ところが、邦訳の「コンピュータアーキテクチャ」は第1版の翻訳しかなく、待ちぼうけを食らっている状態でした。

(;^ω^)しかも、このシリーズは改訂が早いので、第1版はさすがに時代遅れになっていそうでした。

そんな最中に、書店でいきなり第4版を発見したので、激しく興奮したわけです。しかも、第1版の邦訳の価格(12,233円)や原書第4版の価格(3/5現在、9,536円)よりも安い(8,610円)のです。

こういった高い本は、発行部数や増刷も少ないと考えられるので、速攻で確保しなければなりません。特に、それが名著ならばなおさらです。

(;´Д`)実際、名著と聞いて調べてみると、既に絶版になってしまった本もいっぱいあります。

というわけで、約9,000円もするにもかかわらず、衝動買いしてしまいました。

もっとも、衝動買いしたのはいいのですが、横を見ると、これから読もうとしている専門書が数冊積み重なっています。なるべく早く消化しないといけないのですが、分厚い本も多いので、「コンピュータアーキテクチャ」を読むのはもうしばらく先の話になりそうです。

(;^ω^)お金もそうですが、時間がとにかく欲しいですね。


DATE : 2008/03/01 (Sat)

高校時代の友人と遊びに行ってきました。ほぼ半年ごとに集まっているのですが、 みんな元気そうで良かったです。

ところが、以前とは少しだけ様子が異なっていました。それは、mixi の話題が増えたこと。私は mixi のアカウントを持っていないので、mixi の話題が出てきてもただ何となく相槌を打つしかありませんでした orz

マイミクがうんぬん、という話が出てきても、何となくブックマークのようなものかなとしか想像できません。もともと mixi にはあまり興味がなかったために、マイミクと初音ミクが頭の中で関連づけされてしまう始末でした。

それにしても、あんがい広まっているものですね。はじめ招待制と聞いたときには、自分のまわりまで広がるにはいつになることやらと考えていたのですが、ここ最近でまわりは mixi ユーザだらけになってしまったような気がします。

こんな状況になってしまうと、居心地が悪くて、ちょっとは mixi に手を出してみようかなと思ってしまうのですが、どうもあしあとのシステムが好きになれなくて躊躇してしまいます。

(;^ω^)ここまできたら、あえて mixi 八分を貫くのも一興かもしれませんね。

(;^ω^)もっとも、ブログもはじめは自分が使うわけがないと思っていたので、mixi も分かりませんけどね。ただ、もうしばらくは意地を張ってみたいと思います。


DATE : 2008/02/26 (Tue)

数ヶ月前にVisual Stuio 2008 Express Edition 日本語版が公開されたので、この機会に Visual Basic に手を出してみました。

(;^ω^)これまで小物ツール用には Ruby や Python を使ってきたのですが、GUI を使うツールを作るには画面上で UI をデザインできる Visual Stuio の方が手軽だと判断したためです。言語としては C# も考えましたが、小物ツールの規模の面や手軽さ、VBA の勉強にもなるといった点、BASIC 系の言語は未経験だったことから、Visual Basic を選びました。

MSDN ドキュメントのチュートリアルを一通り終えて早速ツールの開発に取りかかりましたが、GUI デザイナがあるのはやはり便利ですね。とりあえずぺたぺたとフォームに貼り付けて、イベントを処理するコードを書けばいいので楽です。

(;^ω^)もっとも、UI 以外の処理はメソッドやクラスにうまく分けていかないと、あっという間にスパゲッティーコードのできあがりですが……。

Visual Basic の方も、大まかな部分はこれまで使ってきた言語とほぼ同じだったので、それほど苦労せずに使えるようになりました。もっとも、プロパティやイベント関係の部分は、これまで使ってきた言語にはなかった(もしくは、言語として用意されていなかった)ものなので、少々勉強が必要でしたが、概念自体は Java で実装されているものと似ていたのでこの部分もそこまで問題ありませんでした。

結果として、小物ツールは(言語の勉強の時間を除いて)1週間ほどで完成しました。コントロールを動的に生成したりとややこしい部分があったり、.NET Framework そのものも初めてだったこともあって手間取りましたが、なんとか満足のいくものができました。

(;^ω^)問題は、他にも GUI を使う小物ツールを作る機会がこれからもあるのか、ということですね。Visual Basic や .NET Framework を忘れないうちに、作る機会があるといいのですが……。もっとも、余裕があれば C# も勉強してみたいところです。


DATE : 2008/02/17 (Sun)

久々に統計処理を行うことになったので、R 2.6.2 を Windows Vista にインストールしました。

Windows Vista にはメイリオが標準で搭載されているので、R GUI を開くともちろんメイリオでコンソールが表示されます。Clear Type で表示されるので、前に BDF M+ を使っていたときよりも表示が滑らかで綺麗です。

ところが、その画面でコマンドを打ち込もうとすると、カーソルの位置と文字の入力される位置とがどんどんずれていくことが分かりました。例えば、カーソルをアンダーバー(_)で表すと、正常であれば、

> read.csv("test.csv")_

となるはずが、

> read.csv("test.csv")                                         _

という具合にずれてしまうのです。

そこで、ほかのフォントに変更しようと思ったのですが、変更がまったく反映されません。R の GUI 設定は、「<r のインストールフォルダ>\etc\rconsole」で管理されており、この設定ファイルを手動、もしくは R の GUI 設定ウィンドウから保存で変更すれば、次回の起動時にもフォントの変更が反映された状態になります。

はじめは、Vista 特有の問題かと思いました。R 公式の R Windows FAQ2.24にも、Vista では管理者権限がないと動作がおかしくなる場合があると記されていました。しかし、いろいろ試してみましたが、やっぱりうまくいきません。

そこで、R の動作のうち、設定ファイルに関係していて怪しい部分を調査してみることにしました。R の GUI 設定ウィンドウで Rconsole ファイルの読み込み・保存をする際にまず開くフォルダは、なぜか使用中のユーザのドキュメントフォルダでした。R を起動したショートカットから、R の作業フォルダの設定を見てみます。すると、作業ディレクトリがユーザのドキュメントフォルダになっていました。しかし、作業ディレクトリの変更を行っても、フォントはメイリオのままです。

そこで、ふと以前に R を使っていた頃を思い出しました。そのころ使っていた R では、GUI 設定ウィンドウから設定を保存しようとすると、「<R のインストールフォルダ>\etc」がまず開かれていました。「もしかして、その場所に Rconsole ファイルを置けば反映されるかもしれない」と考え、さっそくそこに、フォント設定を変えた Rconsole ファイルを置いてみました。すると……。

「この場所には同じ名前のファイルが既にあります。」

( ゚д゚)……

(゚д゚ )……

なぜか、Rconsole ファイルが既にありました。おそらく、GUI 設定ウィンドウをいじっているうちに、いつの間にかドキュメントフォルダに保存してしまったのでしょう。ドキュメントフォルダの Rconsole ファイルを消してみます。すると、きちんと「<R のインストールフォルダ>\etc\Rconsole」にある Rconsole ファイルが適用されて、コンソールのフォントが変わりました orz

(;´Д`)実に情けないミスでした。これで1~2時間は潰れたような気がします

忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック