問題タブ [proto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - Rでの環境連鎖
私のR開発では、オブジェクトのメソッドが呼び出されたproto
ときに多数の引数を関数に自動的に渡すことができるように、関数プリミティブをオブジェクトにラップする必要があります。$perform()
関数の呼び出しは、内部で。を介して行われdo.call()
ます。関数が、それが定義されているクロージャから変数にアクセスしようとする場合を除いて、すべてが順調です。その場合、関数は名前を解決できません。
これは、動作を再現する私が見つけた最小の例です。
再現性のあるtestthat
テストがあり、多くの診断出力も出力されます。診断出力は私を困惑させました。親環境チェーンを検索することにより、関数内にある私の診断コードは、関数が検出できないのとまったく同じ変数を検出して出力します。この要点を参照してください。。
do.call
の環境を正しく設定するにはどうすればよいですか?
performance - R:参照によるデータフレームの受け渡し
Rには値渡しのセマンティクスがあり、偶発的な副作用を最小限に抑えます(良いことです)。ただし、コードが再利用可能性/読みやすさ/保守性のために多くの関数/メソッドに編成されている場合、およびそのコードが一連の変換/操作を通じて、たとえばビッグデータフレームを介して大きなデータ構造を操作する必要がある場合、値渡しのセマンティクスが導きます周りのデータの多くのコピーと多くのヒープスラッシング(悪いこと)に。たとえば、関数パラメータとして渡されるヒープで50Mbを使用するデータフレームは、少なくとも関数呼び出しの深さと同じ回数だけコピーされ、呼び出しスタックの最下部のヒープサイズはN*になります。 50Mb。関数が呼び出しチェーンの奥深くから変換/変更されたデータフレームを返す場合、コピーは別のNだけ上に移動します。
SOの質問データフレームの受け渡しを回避するための最良の方法は何ですか?このトピックに触れますが、参照渡しの質問を直接行わないように表現されており、勝者の答えは基本的に「はい、値渡しはRの仕組みです」と述べています。それは実際には100%正確ではありません。R環境では、参照渡しのセマンティクスが可能になり、 protoなどのOOフレームワークはこの機能を広範囲に使用します。たとえば、protoオブジェクトが関数の引数として渡され、その「マジックラッパー」が値で渡される場合、R開発者にはセマンティクスが参照渡しされます。
ビッグデータフレームを参照で渡すことは一般的な問題のようで、他の人がどのようにそれにアプローチしているか、そしてこれを可能にするライブラリがあるかどうか疑問に思っています。私の検索では、私はそれを発見していません。
何も利用できない場合、私のアプローチは、データフレームをラップするプロトオブジェクトを作成することです。このオブジェクトを便利にするために追加する必要のあるシンタックスシュガーについてのポインターをいただければ幸いです。たとえば、$演算子と[[演算子、および注意が必要な落とし穴をオーバーロードします。私はRの専門家ではありません。
私のニーズはデータフレームだけですが、Rとうまく統合するタイプにとらわれない参照渡しソリューションのボーナスポイント。
r - R: 環境のキャッシング/メモワーズ
メモ化を使用して、特定の高価な操作の結果をキャッシュし、何度も計算されないようにしたいと考えています。
memoiseとR.cacheの両方が私のニーズに合っています。ただし、キャッシングは呼び出し間で堅牢ではないことがわかりました。
私が見ている問題を示す例を次に示します。
回答に基づいて更新
この質問は、永続的キャッシングと非永続的キャッシングのどちらが使用されているかによって、異なる回答になる可能性があります。非永続的なキャッシュ ( などmemoise
) では、単一の割り当てが必要な場合があり、以下の回答が適切な方法です。永続的なキャッシュ ( などR.cache
) はセッション全体で機能し、複数の割り当てに対して堅牢である必要があります。上記のアプローチはR.cache
. 複数の割り当てにもかかわらず、fn
は で 1 回だけ呼び出されR.cache
ます。で 2 回呼び出されmemoise
ます。
問題があると思った理由は、 に関数としてメソッドをR.cache
渡していたからです。メソッドは、困難な方法で環境にバインドされます。この場合、関数をアンバインド (インスタンス化されたメソッドから単純な関数に取得) してから、最初の引数としてオブジェクトを手動で渡す必要があります。次の例は、これがどのように機能するかを示しています ( と は両方ともオブジェクトです:proto
memoizedCall
proto
R.cache
Report
Report$loader
proto
環境にバインドされた通常の関数では機能するが、インスタンス化されたメソッドR.cache
では失敗する理由を知りたいです。proto
r - R:リストするプロトシリアル化/逆シリアル化
proto
いくつかの単純なオブジェクトを永続ストア(MongoDB )に格納できるようにしたいと思います。そこでは、それらのプロパティを他のプログラミング言語のコードで操作できます。簡単に言うと、他のプロトオブジェクトを参照しないということです。それらのプロパティは、一般的なRタイプ(リスト、ベクトルなど)になります。さらに、各オブジェクトには、プロパティ値を含むリストを指定してオブジェクトを作成するファクトリメソッドを含めることができます。したがって、MongoDBからprotoへのパスは単純に見えます。
私はの内部とR環境の連鎖をよく理解していませんproto
-すべてのプロトオブジェクトのプロパティをRリストとして取得するためのシンプルで堅牢な方法があるかどうかを知るのに十分です。これは自動的に実行できますか、それともメソッドのようなものを実装するすべてのプロトオブジェクトについて考える必要がありますto_list()
か?
testthat
ここで見たい動作について開発しているいくつかのサンプルコードと新しいMongoDBドライバーAPI:
r - ggplot2オブジェクトの各レイヤーのgeomタイプを判別する方法は?
すでに作成したプロットから特定のgeomを削除する取り組みの一環として(SOリンクはこちら)、ggplot2オブジェクトの各レイヤーのgeomタイプを動的に決定したいと思います。
レイヤーを追加した順序がわからないと仮定して、特定のジオメトリを持つレイヤーを動的に検索する方法はありますか?以下のようにレイヤーを印刷すると、レイヤーがリストに保存されていることがわかりますが、geomタイプにアクセスできないようです。
私はプロトオブジェクトに精通しておらず、プロトドキュメントから試したことがうまくいかないようです(例p$layers[[1]]$str()
)。
以下の回答のおかげで、レイヤーを動的に削除する関数を思いつくことができました。
r - R パッケージからの環境のエクスポート
rmongodb
パッケージをラップし、MongoDB を操作するための開発者向けのインターフェイスを作成するR パッケージを開発しています。パッケージはproto
内部で使用します。
と呼ばれる proto オブジェクト (環境) を介して単一のファクトリ メソッドをエクスポートしたいと思いますMongoDB
。その定義は次のとおりです。
RStudio での開発中devtools
およびローカルでのテスト中、これは問題にはならないようです。ただし、いくつかの問題が発生しています。
devtools::check()
「名前空間の依存関係は必要ありません: 'MongoDB'」で失敗するimport(MongoDB)
私の NAMESPACE ファイルに入れることを主張します。R CMD check
このインポート ディレクティブを削除すると、手動で追加しても
R CMD check
、テストの実行中に「オブジェクト 'MongoDB' が見つかりません」というエラーが表示されて失敗します。ただし、RStudio では問題なく動作します。testthat
export(MongoDB)
devtools::test()
proto
環境であるオブジェクトを R パッケージからエクスポートするための推奨される方法は何ですか?
アップデート:
以下のガボールの提案に従って、それがデータとしてMongoDB.Rd
宣言MongoDB
されていることを確認しました(リンクにはソースがあります)。MongoDB
テスト(を使用)で表示されないというエラーが引き続き発生しますtestthat
。私のDESCRIPTION
ファイルはここにあり、NAMESPACE
ここにあります。