RでMS Excel 2010を拡張する

こんにちは、読者の皆様。
今日は、R言語の機能とMS Excel 2010のオフィススイートを接続する方法を示したいと思います。以下では、R関数の助けを借りて組み込みVBA言語の機能を拡張する方法について説明します。RExcelアドインはこれに役立ちます。 インストール手順は、ネットワーク上またはオフで簡単に見つけることができます。 サイト。



タスク設定とプリセット


VBAからR関数を使用できるようにするに 、Excelで「Visual Basic Editor」Alt + F11 )を開く必要があります。 その後、 RExcelVBAlibモジュールをプロジェクトに追加する必要があります。これを行うには、 [ツール]-> [参照]に移動し、目的の項目にチェックマークを付けます。

このモジュールにはrinterfaceクラスが含まれており、これを介してバンドルのコンポーネントの相互作用が行われます。
デモンストレーションのために、2011年12月16日から2014年3月20日までの期間のFinam Webサイトからドル相場の初期データを取得しました。 たとえば、Rに基づいて、月次の始値を変更するスケジュール( 'OPEN' )を構築します。

RExcelのrinterfaceを使用する基本


まず、Rでタスクを実行し、 agg_price.Rなどのファイルに保存するコードを記述しましょう(後で必要になります)。

 library(zoo) agg_price_func <- function(x) { y <- zoo(x$OPEN, as.Date(as.character(x$DATE),"%Y%m%d")) new_y <- aggregate(y, as.yearmon, mean) plot(new_y) return (new_y) } 


このコードが何をするのか見てみましょう。
まず、 zooライブラリをロードします。これは時系列で作業する必要があります。
次に、以下を実行する関数を作成します。

そこで、Rコードを作成しました。 VBAから呼び出す方法を見てみましょう。
これを行うにはいくつかの方法があり、以下に示します。

方法1.関数コマンドの行ごとの実行。

この方法は、最も理解しやすく、コードの行数が最も長くなります。 その手順コードは次のとおりです。

 Sub call_r_func() RInterface.PutDataframe "open_price", Range("USD!A1:C535") RInterface.RRun "library(zoo)" RInterface.RRun "price <- zoo(open_price$OPEN, as.Date(as.character(open_price$DATE),""%Y%m%d""))" RInterface.RRun "agg_price <- aggregate(price, as.yearmon, mean)" RInterface.RRun "plot(agg_price)" RInterface.InsertCurrentRPlot Range("OPEN_PRICE!A1"), widthrescale:=0.5, heightrescale:=0.5, closergraph:=True End Sub 


この手順でわかるように、 rinterfaceの 3つの関数が使用されます。
  1. PutDataframe
  2. RRun
  3. InsertCurrentRPlot

PutDataframe関数は、データフレームタイプのR変数にデータをロードするために使用されます。 最初のパラメーターとして、インターフェースが使用する将来の変数の名前が渡されます。 2番目のパラメーターは、変数に含まれる値の範囲です。
RRunは、インタープリターRのコマンドを実行します。パラメーターとして、文字列が渡され、実行されます。
InsertCurrentRPlotリストの最後の1つは、指定されたMS ExcelシートへのRグラフィックの出力を実行します。 最初のパラメーターとして、セルが送信され、そこにグラフが表示されます。 widthrescaleおよびheightrescaleパラメーターは、プロットのスケーリングに使用されます(この場合、50%)。 closegraphは、 plot()関数を使用してplot()れたグラフを閉じる必要があることを示します。
上記の関数の後、 call_r_func()プロシージャの操作は質問を引き起こすべきではありません。 つまり、この手順では、上記のRスクリプトを1行ずつ実行するだけです。
この方法の利点は、 すべてのコードがVBAマクロに集中していることです。これは、小さなタスクに便利です。
欠点は、Rコードの不便なデバッグです。

方法2.外部関数を使用してグラフを表示します。

このメソッドの手順は次のとおりです。

 Sub call_r_impotr_func_without_print() RInterface.RunRFile "D:/agg_price.R" RInterface.RunRCall "agg_price_func", AsSimpleDF(Range("USD!A1:C535")) RInterface.InsertCurrentRPlot Range("OPEN_PRICE!H1"), widthrescale:=0.5, heightrescale:=0.5, closergraph:=True End Sub 


このコードには3つの新しい関数があります。
  1. RunRFile
  2. AsSimpleDF
  3. RunRCall

このリストの最初のRunRFile.rファイルのコードを実行できます
AsSimpleDFは、パラメーターで選択された範囲をデータセットタイプ( dataframe )に変換します。
RunRCall関数はプロシージャ呼び出しを行い、結果を返しません( リターン(...)は無視されます)。 プロシージャの名前は最初のパラメータとして渡されるか、そのコードはRです。後続のすべてのパラメータは、プロシージャで定義されたパラメータ(この場合は1)を渡します。
上記の説明から、 call_r_impotr_func_without_print()プロシージャが最初に外部agg_price.Rファイルを実行することが明らかになります。 次に、 agg_price_func関数を呼び出して、指定された範囲からデータを収集します。 そして最後に、与えられたシートにグラフを表示します。
この方法の利点は、 Rでのコードのデバッグ簡単なことです。 任意のエディターまたはIDEで作成できます。
マイナスのうち、1つのファイルではなく、xlsとrを取得することに注意してください。

方法3。データ出力とグラフで外部関数を使用します。

手順コード:

 Sub call_r_impotr_func_with_print() RInterface.RunRFile "D:/agg_price.R" RInterface.GetRApply "agg_price_func", Range("OPEN_PRICE!A19"), AsSimpleDF(Range("USD!A1:C535")) RInterface.InsertCurrentRPlot Range("OPEN_PRICE!D19"), closergraph:=True End Sub 


この手順には、前の手順とのわずかな違いが1つだけあります。つまり、
RunRCallRunRCallと呼ばれGetRApply
この関数の違いは、結果を返すことができ( リターン(...)は無視されない)、ある種のコードを実行するだけでないということです。 手順と機能の定義に精通している人にとっては、この違いは理解できます。
さらに、 GetRApply 、関数名を持つパラメーターの後に、関数操作中に取得された値が表示されるセルの範囲を示す必要もあります。
このアプローチの長所と短所は、前のアプローチと同じです。

おわりに


これらのVBAプロシージャを実行すると、テストシートは次のようになります。

この記事では、 VBAからRコードを実行するための最も便利なオプションを示しました。 さらに、これらすべての方法の長所と短所は、圧縮形式で説明されています。 また、RExcelはVBAなしでも動作することを言わなければなりません。
rinterfaceインターフェースのすべての機能が示されているわけではありませんが、この資料により 、記載されていない機能を最小限の時間で習得することができます。
手順のファイルは、 GitHubから取得できます。

Source: https://habr.com/ru/post/J219229/


All Articles