Hatena::ブログ(Diary)

もうカツ丼でいいよな このページをアンテナに追加 RSSフィード Twitter

2009 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 12 |
2012 | 02 | 03 | 04 | 05 | 06 | 10 | 11 | 12 |
2013 | 01 | 02 | 04 | 06 |
2014 | 06 |

2009-08-13

[][][]gnuclient(emacsclient)が便利って話とESSのこと 01:08 gnuclient(emacsclient)が便利って話とESSのことを含むブックマーク gnuclient(emacsclient)が便利って話とESSのことのブックマークコメント

先日の読書会でRのfix(),edit()などを使うときのエディタが指定できるということを知った(というか外部のエディタが立ち上がるのだということを初めて知った)のだけれど,手元のESSだと"gnuclient.exe"というものがデフォルトになっていて,しかもそのままだと使えなかったのでちょっと調べていた.結局,ESSを使う限りはあまり役立たない(fix()やedit()を使う必要性がそもそもほとんどない)ということが分かった.ただgnuclientは便利だって分かったし,他にもいくつか学んだので一応メモ.

gnuclient, emacsclient

Meadow(Emacs)は普通に使ってれば起動がすごく重いエディタだと思う.だから一旦立ち上げたMeadowはそのままにして,新しいファイルは全部その立ち上がってるMeadowで開いてしまいたい..txtをダブルクリックで開くような場合にも既存のMeadowの中で開いてほしい…

というような願いを叶えてくれるのがgnuclientやemacsclient.2つの違いはよくわからない.

手元のMeadow 3.00はNetinstallでインストールしたヤツだけど,emacsclientは既に入っていた.

gnuclientについてはNetinstallerからパッケージのgnuservをインストールすると入る.おそらく/Meadow/binにgnuclient.exeとかgnuclientw.exeとかが入ってる.このgnuclientw.exeをテキストファイル等に関連付けしておくとかしておいて,gnuclientw.exeからファイルを開くと既に開いているMeadowの新しいフレームとしてファイルが開かれる.

ついでに環境変数を設定しておくとさらに便利になる.GNUCLIENTに-Fを指定しておくとgnuclient(w)で開いたときMeadowフォアグラウンドになり,RUNEMACSにRunMW32.exe(パスが通ってない場合はフルパス)を指定しておくとMeadowが起動していなかった場合にMeadowを起動してくれるようになる.詳しいことは【インフォシーク】Infoseek : 楽天が運営するポータルサイトなどを参照のこと.

あと,.emacsに次の様に書いておくと既存のフレーム内でファイルを開くようになるのでお好みでどうぞ.

;; 新しいフレームを開かない
(setq gnuserv-frame(selected-frame))

elscreenとの連携

elscreen.elを使っているなら,elscreen-server.elを使うことでファイルを新しいタブで開かせることができる.両者ともにNetinstallerからelscreenをインストールすると入る.使用する場合は.emacs

;; 新しいタブで開く
(require 'elscreen-server)

と書いておく.これは大変快適.

ESSでアレする時

ESSからRを起動させると勝手に

> options(chmhelp = FALSE)
> options(STERM='iESS', editor='gnuclient.exe')

と実行される(環境によってはeditor='emacsclient'となるのかもしれない).

つまり,iESSモードでは既定のエディタがgnuclientになっていて,edit(),fix()を実行するとMeadow上でオブジェクトを快適に編集できる…

…ハズなんだろうけど,どうも上手く動かない.画面が一旦固まってC-gしないといけなくなったり,まともに動いている様に見えるのにエラーが表示されたり.あとelscreen-serverを使ってるとMeadowが落ちたりする.とにかく実用に耐えない.

ただ,そもそもESSを使うのであればfix()やedit()など使う必要がないだろうという意見がある.

言われてみれば確かにfix()やedit()を使ったことはない.使い道も思い付かない.関数やら何やらは.Rファイルの中に書かれているだろうし,修正したければそっちを修正すればいい.

もしオブジェクトの中身をコンソール以外の別窓に展開して眺めるのが目的なら,page()という関数もある.

というわけでESSでgnuclientを動かすのはあきらめた.

あと,ESSからRを起動させたときに実行されるoptionsのeditor='hogehoge'の'hogehoge'の部分は,R-editorという変数で制御できる.例えばedit()などを実行したときにメモ帳を起動させたいのであれば,.emacsに次のように記述しておく.

(setq R-editor "notepad")

どうしてもedit()やfix()を使うというのであれば,メモ帳とかxyzzyとか起動の早い別のテキストエディタを指定しておくと良いかもしれない.

2009-08-10

[][]skype読書会2回目メモ 18:30 skype読書会2回目メモを含むブックマーク skype読書会2回目メモのブックマークコメント

ここからゲノムと計算機すか

2回目でした.今回は人少なめだったけどid:syou6162などが発声とかをしていました.*1

今回はオブジェクトの編集や保存,読み込みなどが中心.

以下みなさんのお話を黙って聞きながらメモったことなど.

fix(), edit()

edit()はオブジェクトを編集した結果を返す.

fix()はオブジェクトを編集し,編集結果をオブジェクトの内容に反映させる.Rubyで言うところの!が付いたアレみたいな感じだろうか.Ruby詳しくないので適当かどうかわからないのだけれども.

オブジェクトがmatrixやデータフレームのときはfix(),edit()を実行するとこのようなエディタが開いた.

f:id:Rion778:20090810172921j:image

その他のオブジェクト,例えばベクトルなどの場合,options(editor='...')で設定したエディタで編集する(多分).

手元の環境(Windows vista)だとRguiの場合はRエディタ,Rtermの場合はメモ帳Meadow+ESSの場合はgnuclient(使えるように設定していないとエラーが出て編集できない)が既定値だった.

gnuclientはテキストとかを新規に開くとき今開いているEmacs(Meadow)で開けるというもので,ESS上でedit(hoge)とするとhogeの中身が新しいフレームなど(設定による)に表示される.便利そうなんだけど手元のMeadow+ESSで試すと若干挙動が怪しい.ベクトルを編集しようとすると固まってC-gしないと抜けられなくなるといった現象が発生している.

read.table()のas.is引数

read.table()でデータを読み込むとき,stringsAsFactors =にTRUE(既定値)を指定すると文字列は因子として読み込まれる.しかし,「1列目だけ因子にしたい」というようなことはできない.そのようなことをする場合はas.is引数を利用する.具体的には文字列を含む列のうち,因子にしたくない列にTRUE,因子にしたい列にFALSEを指定した論理値ベクトルを与える.実例を見た方が分かりやすいと思う.

no title

dput(), dget()

lmオブジェクトみたいな複雑なヤツはdput()でテキストファイルとして保存すると良い.dget()で読み込める.オブジェクト名は保存されない.

> result <- lm(dist~speed, data=cars)
> dput(result, "foo")
> dget("foo")

Call:
 #--略--

Coefficients:
(Intercept)        speed  
    -17.579        3.932  

save(), load()

複数のオブジェクトオブジェクト名を保存しておきたいような時はsave()でまとめて(あるいは一つでも)書き出し,必要なときはload()で読み込む.なおsave()で保存したファイルはテキストエディタでは開けない.

> x <- 1:3
> y <- c(T,F,T)
> z <- c("a","b","c")
> save(x, y, z, file="hogehoge")
> rm(x,y,z)
> x
Error: object 'x' not found
> load("hogehoge")
> x
[1] 1 2 3
> y
[1]  TRUE FALSE  TRUE
> z
[1] "a" "b" "c"

read.fwf()

データの"幅"を指定してread.tableみたいなことができる.exampleを実行すれば意味は分かると思う.

>      ff <- tempfile()
>      cat(file=ff, "123456", "987654", sep="\n")
>      read.fwf(ff, widths=c(1,2,3))    #> 1 23 456 \ 9 87 654
  V1 V2  V3
1  1 23 456
2  9 87 654
>      read.fwf(ff, widths=c(1,-2,3))   #> 1 456 \ 9 654
  V1  V2
1  1 456
2  9 654
>      unlink(ff)

覚えておけば役に立つような気がしないでもないけど,具体的にいつ役立つのかと言われると例が挙げられない.Project Eulerみたいな遊びだと役立つ問題がありそうな気はする.

data.frame()はlist扱い

write()とwrite.table()

write()だとlistが扱えないのでデータフレームを書き込めない.また,matrixもt()で転置しておかないと順序が変わってしまう.write()はcat()のラッパ.

> write
function (x, file = "data", ncolumns = if (is.character(x)) 1 else 5, 
    append = FALSE, sep = " ") 
cat(x, file = file, sep = c(rep.int(sep, ncolumns - 1), "\n"), 
    append = append)
<environment: namespace:base>

write.table()ならそのような問題はない.大抵の場合はwrite.table()で事足りるんじゃないだろうか.

sink()

sink()は出力先を変更する.例えばRguiならR Consoleに出力するのがデフォルトだが,

sink(file="foo.txt")

を実行すれば以降の出力はfoo.txtの中に書き込まれる.その間R Consoleへの出力は出なくなる.

また,引数にappend=TRUEを指定すればファイルを追記モードで開くことができ,split=TRUEを指定すればR Consoleとファイルへ同時に出力できるようになる.

終了(出力をデフォルトに戻す)するには引数なしでsink()を実行すればよい。

以上

こんなところ.まとめられないので適当にずらずら書いた.今のところは基本操作みたいなことが続くので,本文よりも脱線した部分から得るものの方が大きい.

*1:実はid:yag_aysの声と判別できなかった事が何度かあった.やはりやぐさんには次回から一人称わっちで(ry

Connection: close