私は、同僚が一連の比較的複雑なデータ処理タスクを実行できるようにするために、最初の R パッケージを作成しています。分析のデータクリーニングに役立つ多くの R 関数がありますが、ワークフローを合理化して速度を上げ、エラーを減らすいくつかのものを追加しようとしています。
ユーザーが現在実行する必要がある手順の 1 つは、後でさまざまなファイルが格納される特定の一連のディレクトリとサブディレクトリを作成することです。次に、特定のフォルダーに挿入する必要がある Excel ブック テンプレートがあります。現在、R コードを使用してディレクトリを作成できますが、ユーザーは Excel テンプレートを正しい場所に手動でコピーする必要があります。このステップを手動で行うと、テンプレートを間違ったディレクトリにコピーしたり、間違ったバージョンのテンプレートを間違った場所で使用したりして、エラーが発生しやすいことがわかったため、R 関数を使用してこれを自動的に行いたいと考えています。等
注目すべきは、R 関数で再生成しようとしている Excel ワークブック テンプレートがかなり複雑であることです。少量のデータと、多数の書式設定と非表示の式が含まれています。ワークブック テンプレートは、従来の理由からそのままにしておく必要があります。複雑であるため、基本データを入力し、フォーマットを設定し、エラーを発生させずに複雑な数式ルールを設定する R 関数を使用してテンプレートを de novo で作成できるかどうかはわかりません。
これまでの私のアプローチは、次のものを使用することでした。
myWB<-XLConnect::loadworkbook("C:/My Docs/Template.xlsx")
自分のマシンにローカルに保存した Excel テンプレートのコピーから XLConnect "ワークブック" オブジェクトを作成するためです。
新しく作成したワークブックオブジェクトstr()
を調べると、次のように表示されます。
Formal class 'workbook' [package "XLConnect"] with 2 slots
..@ filename: chr "C:/My Docs/Template.xlsx"
..@ jobj :Formal class 'jobjRef' [package "rJava"] with 2 slots
.. .. ..@ jobj :<externalptr>
.. .. ..@ jclass: chr "com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper"
これは、同じ R セッションでインタラクティブに作業しているときに、.xlsx テンプレートのコピーを複製するのに最適です。使うことができます:
XLConnect::saveWorkbook(myWorkbook,file="C:/some new folder/new copy of my template.xlsx")
次に、「いくつかの新しいフォルダー」に移動できます。確かに、「私のテンプレートの新しいコピー.xlsx」は、新しいフォルダー内の元のテンプレートの完全に機能するコピーです。
問題は、私のパッケージのコピーを取得することなく、私のパッケージをインストールした人のマシン上で R がワークブックを再作成するために使用できるある種のオブジェクトとして、私の Excel テンプレート ワークブックをパッケージ内に配置したいことです。 Excelファイル、どこかに保存、移動など。試したのでdevtools::use_data(myWB)
、myWBオブジェクトを.rdaファイルとしてパッケージのデータフォルダーにデータとして保存するために使用しました(内部設定をFALSEに設定してこの関数も試しましたmyWB を R/ に sysdata.rda として保存するため)。
LazyData: TRUE
次に、説明ファイルでパッケージをビルドします。XLConnect::saveWorkbook(myWB,"C:/New folder/copy of template.xlsx")
パッケージが使用する正しいディレクトリにテンプレートのコピーを作成するために使用したいと考えています。パッケージ内の関数は myWB オブジェクトを認識できるので、実際には遅延ロードされていることがわかります。調べてみると、str(myWB)
すべてがそのままのように見えます。
Formal class 'workbook' [package "XLConnect"] with 2 slots
..@ filename: chr "C:/My Docs/Template.xlsx"
..@ jobj :Formal class 'jobjRef' [package "rJava"] with 2 slots
.. .. ..@ jobj :<externalptr>
.. .. ..@ jclass: chr "com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper"
ただし、XLConnect::saveWorkbook(myWB,"C:/New folder/copy of template.xlsx")` を実行すると、次のエラーが発生します。
Error: NullPointerException (Java):
私は Java について何も知りませんが、XLConnect によって作成された myWB オブジェクトは Java オブジェクトであり、オブジェクトをデータとして R パッケージに保存するときに何か (ポインター?) を失っていると思います。
次に何を試しますか?
ありがとうございました。
PS私はスタックオーバーフローにかなり慣れていないので、良い質問をする方法を学ぼうとしています. 新しい R パッケージを作成し、Excel テンプレートのコピーを手元に用意する必要があるため、この質問の再現可能な例を作成するのに本当に苦労しました。幸いなことに、エラーは私のテンプレートの詳細とは無関係のようです。状況と私が試したことを説明する合理的な仕事をしたことを願っていますが、より良い質問を作成するためのフィードバックをいただければ幸いです.