Location : Home > Softwares > R Title : RExcel |
![]() |
R: RExcel - Using R from within Excel
概要
Excel のアドイン RExcel.xla により Excel から R を使用することができる。パッケージには Excel 内で R を利用するための異なるテクニックを示す Excel ワークブックを含んでいる。
サーバタイプには forground と background の2種類がある。background ではサーバはユーザから完全に隠されており、全ての R とのやり取りは Excel 内で行われる。foreground では Excel 内で直接 R GUI コマンドラインを利用して稼動する。backgound サーバは R(D)COM サーバとともにインストールされ、CRAN からインストールされる {R}-パッケージ rcom に依存する。
使用方法
Excel から R を利用するには少なくとも3つの方法がある。
RExcel.xla
で提供されるマクロとVBAマクロを記述して利用する。RExcel メニューには以下の項目が含まれている。
R Start
R プロセスをバックグラウンドで起動する。
Close R
R プロセスが起動していれば停止する。
Run Code
妥当な R コードを含む Excel の領域(ただし列の幅は1列とする)を選択肢、このメニュー項目を選ぶと、そのコードを実行する。
Get
R の変数を Excel のアクティブセルに取得する。対象となる値はスカラー、数の行列、文字列、データフレームである。
Put
選択された Excel の領域の値を R の変数に渡す。対象となる値はスカラー、数の行列、文字列、データフレームである。もしデータフレームを渡す場合には、領域の最初の行は変数名でなければならない。また非表示になっている行や列は渡す対象とならない。
Copy Code
VBAマクロに転記するために選択した領域( R のコードとする)をクリップボードに格納する。
Debug R
デバッグモードに切り替える:実行前にポップアップで実行内容を表示する。
Error Log
エラーメッセージやデバッグ情報を表示するために新たにウィンドウを開く。
Set R Server
サーバのタイプとロケーションを指定できるようにする。RCom ライブラリがインストールされていれば RExcel をフォアグラウンドサーバとして利用できるようにし、同時に RExcel メニューにおける RCommander メニュー項目でアクティブ化/非アクティブ化する。
Options
RExcel のメニューの表示を切り替える。
RExcel Help
RExcel のヘルプファイルを表示する。
R Help
R のヘルプファイルを表示する。
About RExcel
含まれる様々なソフトウェアコンポーネントのバージョン情報を表示する。
R 変数または R 式の名前に対する Get または Put を実行することができる。
R 変数または式の値は数字・文字列のスカラ、ベクトル、行列、データフレームに限られ、そうでない場合は RExcel はエラーを返す。ユーザダイアログでは変換するための配列及びデータフレームのための行名を指定することもできる。この場合、最初の列は Excel の領域選択していればその行の名前を定義する。データフレームの場合は常に行名が変換される。配列の場合は行名の変換はオプションで、最初の列が行名として設定される。
Excel が R プロセスとの接続を行えばセルのコンテキストメニュー(選択したセルまたは領域で右クリックすればよい)に Run R, Get R Value, Put R Var, Get R Dataframe, Get R Dataframe という RExcel メニューと同じメニューが表示される。
この追加メニュー項目の構造は RExcel のオプションメニューで変更できる。
また、Excel が R プロセスを確保している間は Excel のピクチャコンテキストメニューにも Prettify R graphics が追加される。これは R グラフィックウィンドウからの図を貼る。R からメタファイルでクリップボードにコピーされ Excel に透過背景で境界なしでペーストされる。メニューを利用することで非透過かつ境界付きのものに変更することもできる。
これらのテクニックはサンプルファイル RDemoDev.xls に示されており、このファイルには Demo Worksheets メニューからアクセス可能である。
R にアクセスする VBA マクロは以下の VBA プロシージャ及び関数を用いて書くことができる。
RInterface.StartRServer()
R サーバを起動する。詳しくは起動セクションを見よ。
RInterface.StopRServer()
R サーバを停止する。
RInterface.RRun(commandstring)
コマンド列を実行する。
RInterface.PutArray(varname,range,WithRowNames:=False,WithColNames:=False)
R の変数 var に領域(range)の値を代入する。
命名されたパラメータ WithRownames または WithColNames が True であれば領域の最初の行及び/または最初の列の内容は R オブジェクトの行及び/または列に変換される。R オブジェクトの値はそこに含まれない。
RInterface.PutArrayFromVBA(Rvarname,VBAvarname)
VBA の変数 VBAvarname の内容を R の変数 Rvarname に代入する。
RInterface.GetArray(Rexpr,range)
R の式 Rexpr の値を Excel の領域 range に書き込む。Rexpression はスカラ・ベクトル・行列でなければならない。タイプリストやデータフレームの場合はエラーとなる。
RInterface.GetArrayToVBA(Rexpr)
VBA マクロ内でさらに利用するために R の式 Rexpr の値を返す。RInterface.GetArray と同じ制限が適用される。
RInterface.PutDataframe(varname,range,WithRowNames:=False,RespectHidden:=False)
データフレームとして参照された領域(第1行は変数名とする) の内容を R 変数 var
に格納する。
パラメータ WithRowNames で領域の第1列がデータフレーム変数であるかデータフレームの行名であるかを指定する。なお Excel の領域の最初の行は常にデータフレームの列名であること。
パラメータ RespectHidden が True であれば、非表示の行・列は対象とならない。パラメータが False であれば表示/非表示に関わらず全領域を対象とする。
RInterface.GetDataframe(varname,range)
R 変数 var
(データフレームとする)から値を取得し、Excel の領域に格納する。領域の第1行に変数名を置く。
RInterface.RunRFile(filename)
filename で指定されるファイルに記述されているコマンドを実行する。ファイルはクライアントコンピュータ上にあるものとする。
RInterface.PretttifyGraph(picture)
境界を追加し非透過の背景を設定してピクチャオブジェクトを変更する。
これらのマクロを使ったサンプルはファイル RDemoMacro.xls を見よ。デモワークシートメニューからアクセスすることができる。
R の多くの関数は配列ではない複雑なオブジェクトを返す。これらの複合的なオブジェクトは R から Excel へ RInterface.GetArray では変換されない。コンポーネットは抽出される。そのため RInterface.GetArray("lm(y~x)",Range("C1")) はエラーとなる。RInterface.GetArray("lm(y~x)$coefficients",Range("C1")) とすれば回帰係数を Excel 内の範囲として返す。
Excel のワークシートでは以下のような関数が利用可能である。
RPut(var, range, ...)
R の変数 var
に領域 range の値を代入し、var
の名称を含む文字列を返す。
RStrPut(var, range, ...)
R の変数 var
に文字列として領域 range の値を代入し、var
の名称を含む文字列を返す。
RPutDataframe(var, range, attach, ...)
R 変数 var
に対しデータフレームとして領域 range から値を代入する。領域の第1行(The first row)は変数名を含んでいなければならない。引数 attach が与えられ、かつその値がブール値 TRUE であればデータフレームは代入され、そうでなければ代入されない。var の名称を含む文字列を返す。
RFactor(var, ...)
R の変数を因子(factor)に変換する。var は R で用いることができる名称でなければならない。代入されていないデータフレーム var はデータフレーム $var から与えられなければならない。var の名称を含む文字列を返す。1つ名称だけの引数も受け付ける。
RFactorLevels(var, levels, ...)
R の変数を順序付けられた因数(an ordered factor)に変換する。levels は順序付けられた因数の水準(ordered factor levels)を含む範囲である。var は RFactor の同じ引数のように振舞う。
REval(expression, ...)
式(expression
)の評価の結果を返す。
REvalC(range, component, ...)
範囲内に含まれるコードを評価し、その結果として得られるオブジェクトからコンポーネントを抽出した結果を返す。
Component(args)
文字列の系列を取り、R の式から要素を抽出スする。(リストを返す関数から要素を抽出するために利用される。)
RApply(function, args)
args
によって与えられた引数を関数に適用する。
RApplyC(function, component, args)
args
によって与えられた引数を関数に適用する。セルに含まれている値が関数呼び出しの引数となる。関数の結果はオブジェクトとなり、 RApplyC の返り値はこのオブジェクトの要素コンポーネントである。
RApplyA(function, args,...)
args
によって与えられた引数を関数に適用する。引数は関数呼び出しのすべての引数の文字列である。
RApplyAC(function, component, args,...)
args
によって与えられた引数を関数に適用する。引数は関数呼び出しのすべての引数の文字列である。関数の結果はオブジェクトとなり、 RApplyC の返り値はこのオブジェクトの要素コンポーネントである。
RExec(range, ...)
範囲でしてされた内容を実行するが、R からの結果値を返すのではなく、 "Done:" と R のコードを返す。
RCall(function, args)
arg
で与えられた引数を関数に適用する。関数はプロシージャである。すなわち R には適切な返り値はない。セルに含まれている値が関数呼び出しの引数となり、"Done:" と実行された R のコードを返す。
RCallA(function, args, ...)
arg
で与えられた引数を関数に適用する。関数はプロシージャである。すなわち R には適切な返り値はない。引数は関数呼び出しのすべての引数の文字列であるり、"Done:" と実行された R のコードを返す。
RSetEval(varname, expression, ...)
R の式を R の変数に代入する。指定された変数の名称を返す。
RSetApply(varname, function, args, ...)
引数 args(Excel の値)に関数 function を適用し、R 変数へ結果を代入する。指定された変数の名称を返す。
RSetApplyA(varname, function, argstring, ...)
引数 argstring(R の値、文字列で与えられた引数)に関数 function を適用し、R 変数へ結果を代入する。指定された変数の名称を返す。
MakeArgs(argrange,transpose=FALSE)
Excel の範囲から R 上の引数となる文字列を生成する。transpose=FALSE であれば、範囲は列方向とみなし、そうでなければ行方向とみなす。RApplyA, RApplyAC, RCallA, RSetApplyA への引数を作成するために用いられる。
RNumber(number)
数値を R で定められた小数点記号を含む文字列に変換する。
【注意事項】
RPut
, RStrPut
は必要に応じて行列を代入する。REval
, RApply
, RApplyA
は配列を返す場合がある。(Excel の配列関数として用いられる場合があるため。)AddDescription
は Auto_Open
マクロから呼び出されるべきである。データ変換と欠損値
RExcel では以下のタイプのデータ型を利用可能である。
RExcel は Excel 及び R の欠損値を扱う。Excel には欠損値を示す特別なコードとして #N/A がある。手入力するか関数 NA() で生成することができる。R では欠損値として NA という記号を用いてきた。さらに Excel には異なる数値エラーに対し異なるコードを持つが、R は NaN を用いる。エラー処理が Excel と R と RExcel とで少しずつ異なるため、Excel, Loose, Strict の3つのモードを用意し、Excel - R 間のデータ変換の際に用いることとした。
数値の場合には以下のような3モードがある。(Excel から R への変換時):
mode | 空セル | #N/A | 数値エラー |
Excel | 0 | NA | NaN |
Loose | NA | NA | NA |
Strict | NA | NA | NaN |
文字列の場合には以下のようなモードがある。(Excel から R への変換時):
mode | 空セル | #N/A |
Excel | 空文字列 | NA |
Loose | 空文字列 | NA |
Strict | NA | NA |
逆にR から Excel への変換時には数値の場合は以下の3モードがある。:
mode | NA | NaN |
Excel | 空セル | #N/A |
Loose | 空セル | #N/A |
Strict | #N/A | #NUM! |
文字列の場合にも以下の3モードがある。:
mode | 空文字列 | NA |
Excel | 空セル | 空セル |
Loose | 空セル | 空セル |
Strict | #N/A | #N/A |
サーバタイプとロケーション
RExcel には4種類の異なるサーバタイプを扱うことができ、サーバは RExcel クライアントと同一マシンに置くこともできるし、リモートマシン上に置くこともできる。これにより全部で8種類の異なる利用形態が可能になる。
サーバに関する追加情報については、パッケージに含まれている RExcelReadme.txt を参照のこと。
サーバタイプは以下の通り。
Background
サーバは不可視にバックグランドで稼動し、Excelを通じたRとのインタラクションにおいてのみ稼動する。
Foreground
サーバは可視的にフォアグランドで稼動し、ExcelまたはRGuiのコマンドラインのどちらからのインタラクションでも稼動する。ただし RCom が RExcel と同一マシンにインストールされている場合にのみ可能である。
Serverpool exclusive
R サーバはサーバプール(Serverpool)で管理される。Rの1プロセスに対しExcelの1インスタンスのみアクセス可能である。
Serverpool shared
R サーバはサーバプールで管理される。Rの1プロセスに対し、複数のExcelインスタンスまたは他のCOMクライアントがアクセス可能である。
サーバプールから R サーバを利用するとき(排他的であれ、共有であれ)、RServerManagerAdministrator(R(D)COM サーバとともにインストールされる)のようなプログラムはサーバプールを管理する。
メニュー項目の「Set R server」でサーバタイプ・サーバ名(リモートサーバの場合)・R プロセス名(サーバプールのサーバの場合)を選択することができる。リモートマシン名は名称でもIPアドレスでもよい。
起動
RExcel が R への接続を初期化するとき、いくつかのことが起こっている。
サーバモードが background に設定されているとき、新しい R プロセスが (D)COM サーバとともに起動される。
サーバモードが foreground に設定されているとき、RExcel は RCOM ライブラリをロードしたコマンドから開始された R プロセスがないか確認する。もしあれば RExcel はそのプロセスを利用してアクセスし、そうでなければ新しい R プロセスを起動し、RCOM がロードされる。このプロセスはスタートアップ時に実行される。($RHOME\etc\RProfile.site などで定義。)
それから RExcel はそれがおかれているディレクトリ内でファイル RExcelStart.R を探索する。これは RExcel の特定のカスタマイズを定義している。
最後に RExcel は現在のディレクトリで RExcelStart.R を探索する。Excel の現在のワークブックが過去に保存された .xls ファイルであればこのファイルの含まれるディレクトリが現在のディレクトリである。そうでなければ(設定に依存する)デフォルトの Excel データディレクトリである。
アプリケーションの開発
Excel アプリケーションを開発するのにユーザが R を直接みないようにすることは可能である。R マクロをカスタムメニューから呼び出し、RExcel メニューを隠したままにすることができる。
Excel メニューを隠すには RExcel.xla のモジュール AAConfigParams の最初の行を以下のように変更するとよい。
Public Const DisplayRExcelMenu = False
また RExcel.xla のマクロ(関数ではない)を利用している Excel ワークブックで Excel の VBA 開発環境におけるツール->参照リスト内で RExcelVBAlib を参照しておく必要がある。
サーバタイプ及びロケーションは Excel マクロから設定することができる。
SetServerType(servertype)
以下のサーバタイプを指定することができる。
stLocalBackground
stRemoteBackground
stLocalForeground
stRemoteForeground
stLocalPoolExclusive
stRemotePoolExclusive
stLocalPoolShared
stRemotePoolShared
SetServerName(servername)
妥当なサーバ名を文字列として受け取る。サーバタイプは stRemoteBackground, stRemoteForeground, stRemotePoolExlusive, stRemotePoolShared のみである。
SetProcessName(processname)
妥当な R プロセス名(RServerManager により管理)を受け取る。サーバタイプは stLocalPoolExclusive, stRemotePoolExclusive, stLocalPoolShared, and stRemotePoolShared のみである。
ユーザへの注意
RExcel がグラフィックを生成するとき(マクロからまたはセル数式から)は、R グラフィックを含むウィンドウがフォーカスされる。Excel にフォーカスを戻すには Excel をクリックする必要がある。最初のクリックは Excel における現状の選択を変更しない。特定のセルを選択するにはユーザはセルをもう一度選択する必要がある。したがって Excel を1度クリックするだけではセルは選択されず、2回目の選択が必要である。
著者
Thomas Baier と Erich Neuwirth
参考文献
R(D)COM server, rcom, RExcel の現行バージョン及び開発バージョンは常に http://rcom.univie.ac.at/ で入手可能である。
![]() |
Updated : 2008/05/26 |