問題タブ [reference-class]
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 での標準ソフトウェア設計パターンの実装 (MVC に焦点を当てる)
現在、私はソフトウェア エンジニアリング、ソフトウェア デザイン、デザイン パターンなどについて多くの本を読んでいます。まったく異なるバックグラウンドを持っているので、それは私にとってすべて新しい魅力的なものです。正しい技術用語を使用していない場合はご容赦ください。特定の側面を説明するために;-)
ほとんどの場合、参照クラス(R の OOP の方法)を使用することになりました。これは、オブジェクト指向が、私が行っている多くのことにとって正しい選択であるように思われるためです。
さて、できれば参照クラスを使用して、RでMVC(モデルビューコントローラー、MVP :モデルビュープレゼンターとも呼ばれます)パターンを実装することに関して、誰かが良いアドバイスや経験を持っているかどうか疑問に思っていました.
また、 observerやblackboardなどの他の「標準的な」デザイン パターンに関する情報にも非常に興味がありますが、これをあまり大雑把な質問にしたくはありません。最もクールなことは、最小限のサンプルコードを見ることだと思いますが、ポインター、「スキーマ」、図、またはその他のアイデアも大歓迎です!
同様のことに興味がある人には、次の本を本当にお勧めします。
2012 年 3 月 12 日更新
最終的に、MVC の解釈の小さな例を思いつきました (完全に正しいとは限りません ;-))。
パッケージの依存関係
クラス定義オブザーバー
クラス定義モデル
クラス定義コントローラーとビュー
ダミーデータを表現するためのクラス定義
インスタンスを作成する
モデルの特性とオブザーバーの状態を調べる
オブジェクトの uid は、初期化時にオブザーバーに自動的に登録されていることに注意してください。そうすれば、コントローラー/ビューは通知をサブスクライブでき、1:n の関係になります。
ビューとコントローラーをインスタンス化する
申し込む
コントローラーは、基になるモデルの通知をサブスクライブします
サブスクリプションがオブザーバーに記録されていることに注意してください
登録済みビューの表示
開いているプロット ウィンドウもあります。
モデルの修正
基になるモデルがその状態の変更をオブザーバーに公開すると、両方の登録済みビューが自動的に更新され、オブザーバーがすべてのサブスクライバー (つまり、コントローラー) に通知することに注意してください。
未解決の質問
まだ完全には理解できていないと感じるのは次の点です。
- これは MVC パターンの正しい実装ですか? そうでない場合、私は何を間違えましたか?
- モデルの「処理」メソッド (データの集約、サブセットの取得など) は、モデルまたはコントローラー クラスに「属する」必要があります。これまでは、特定のオブジェクトが「実行」できるすべてのことを、このオブジェクトのメソッドとして常に定義してきました。
- コントローラーは、モデルとビューの間のすべての相互作用を制御する「プロキシ」のようなもの (「双方向」のようなもの) である必要がありますか、それともユーザー入力をモデルに伝達することのみを担当する必要がありますか (「一方向」のようなものですか?)
r - 参照クラスの RefClass オブジェクトのリスト (または配列)
オブジェクトを含む親クラスを作成できます
ただし、他の RefClass オブジェクトの配列を使用して RefClass オブジェクトを作成したいと考えています。「リスト」をプレースホルダーとして使用して手動で入力できますが、より良い方法はありますか?
たとえば、特定のオブジェクトを保持するために「リスト」タイプを指定できますか? 仮説的には、次のようなものです: (ただし、機能しません)
「imgList」でメソッドを呼び出すときに、「img」要素ごとにメソッドを呼び出すことを知っていることを願っています。
r - R:クラスのフィールド(スロット)の値を変更して、他のフィールドに値を割り当てます
1つのフィールドに値を割り当てると、他のフィールドを変更するにはどうすればよいですか。
ReferenceClass
次のオブジェクトについて考えてみます。
次に、クラスのインスタンスを作成します
このコマンド
その結果、c $ aは10、c$bは20になります。
だから実際には動作しますが、コマンドでこの結果を達成したい
(つまり、その後、seta()関数のロジックのクラスで定義されているようにc $ bを20に等しくしたい)
どうすればよいですか?
r - R参照クラスの問題
Rで単純な参照クラスを作成しようとしています.これが私のコードです(R初心者):
これにより、最後の行 a$printValues で次のエラーが発生します。
また、初期化メソッドが呼び出されていませんか?
誰かが問題がここにある場所を教えてもらえますか? よろしくお願いします。
r - 参照クラスのフィールドが消える
リファレンスクラスに別のショットを与えることにしましたが、私の最初のhelloworldはすでに問題を抱えています。ここで何が問題になっていますか?
r - 関連するオブジェクトからS4参照クラスを定義する実際のソース式を取得する
要するに(実際の質問)
または(実際のソースファイルを調査するのではなく、ソースされた後)によって返されたオブジェクトからS4参照クラス(を参照)を定義する実際のソースコード/式にアクセスするにはどうすればよいですか??setRefClass
getClass("MyClass")
getRefClass("MyClass")
私がした宿題
すべてがRのオブジェクトなので、ソースコード/式を取得できます。
1)それぞれのオブジェクトを調査するだけの通常の機能:
2)特定のメソッドのメソッドオブジェクトを次の方法で取得することによる形式手法selectMethod
:
ただし、S4リファレンスクラスでは状況が異なるようです。
クラスを正確に定義する実際のソースコード/式が格納されている属性が見つからないようです。
念のために言っておきますが、この式は私がアクセスしたいものです
背景/動機
私はS4参照クラス( )をよく使用するため、クラスの継承?setRefClass
などのOOPの側面が日常業務で大きな役割を果たします。また、整理された状態を維持するために「ファイルごとに1つの定義」パラダイムに従います。そのため、さまざまなクラス定義は、ファイル名がそれぞれのクラスの名前に対応する個別のファイルに格納されます。
人生のすべてと同様に、いくつかの利点がありますが、そのようなアプローチにはいくつかの固有の欠点もあります。
アスペクト1
短期間でも長期間でも、個々のソースファイルのアルファベット順のファイル順序と一致しない継承構造になってしまいます。したがって、ファイルを次々にソースするだけでは、必要なスーパークラスがまだソースされていない特定のポイントでエラーが発生します。
class_A.R
はフォルダ内の最初のファイルですが、ソースを作成するには、classes
最初にソースを作成する必要がありますclass_B.R
(このファイルはクラスを定義しているB
ため)。これにはクラスが必要でC
あり、したがって、の事前のソーシングが必要ですclass_C.R
。
したがって、正しい照合は次のようになります。
アスペクト2
特定のタスクでは、「ファイルごとに複数の定義」パラダイムが必要です。パラダイム化するときに必要なオブジェクト/関数/クラスをワーカープロセスにすばやく簡単に配布し、実際にパッケージをビルドするときにコードを整理します。
広告アスペクト1
正しい照合順序を指定するある種の手動照合参照を保持するという考えは、コンピューターが私のために簡単に実行できる(正しい照合を見つける)仕事だと思うので、好きではありません。ここで行う必要があるのは、各クラスのスーパークラス(その依存関係の一種)を見つけることだけです。次に、正しい照合を取得するのは簡単です。
編集
誰かが興味を持った場合:私はこれのための実用的なアプローチを思いついた。コードを見たい場合に備えて、私に連絡してください。contains
これは、スーパークラスをリストする引数の値を調査するために、それぞれのクラスdefソースファイルを(評価せずに)解析することに基づいています。その後、最終的に正しい照合が行われるまで、これらのスーパークラスのソースファイルに対してプロセス全体が再帰的に繰り返されます。それほど時間もかかりません。
概要は次のとおりです。
広告アスペクト2
また、手動でのコピーと貼り付けも好きではないので、個々のファイルに保存されているか、それぞれのオブジェクトから描画されたソースコードを単一の「統合」ファイルに統合できるルーチンを実装しました(およびを介しdeparse(<source_code_expression>)
てwrite(..., append=TRUE)
)。クラスに関しては、ここでも正しい照合が重要です。そうでない場合、統合ファイルを入手しようとすると、再びエラーが発生します。
どちらの側面でも、クラス/関数/メソッドの実際のソースコード/式にアクセスする方法を選択できると便利です。
- それぞれのソースファイルに保存されているコードの調査に基づく(
parse(file=*)
) - または、それぞれのオブジェクトから直接必要な情報にアクセスすることに基づいています。
2番目のオプションは、上記の実際の質問へのリンクです。
r - 参照クラス、タブ補完、および強制メソッド定義
私は現在、参照クラスを使用してパッケージを作成しています。私はさまざまな情報源を読んだことから問題に遭遇しました:
SnowfallでRefClassメソッドを確実に使用できない
私が収集するのは、参照メソッドがクラス内のすべてのオブジェクトにすべてコピーされるのではなく、最初にアクセスされたときにコピーされるためです。
https://stat.ethz.ch/pipermail/r-devel/2011-June/061261.html
例として、以下を定義します。
したがって、例はクラスの新しいオブジェクトですTEST
。コンソールで入力example$
してタブを押すと、
そのため、この方法addone
はオプションとして提示されていません。ただし、電話をかけることができます。
今度はタブでもう一度表示します
だから今addone
そしてfield
そしてshow
オプションとして提示されています。
Martin Morganは、上記のリンクの1つでメソッドの定義を強制することをお勧めします。これはうまくいきます
だから今タブは与える:
私のクラスのいくつかは30以上のメソッドを持っているので、これをできるだけ簡潔にしたいと思います。私は定義しました:
タブを使用すると、次のようになります。
これは機能しますが、少し不器用に感じます。また、それは少し間違っていると感じるようにではtest$def@refMethods
なく使用されます。getRefClass("TEST")$def@refMethods
誰かが以前にこの問題に対処したことがあります。
解決策にアプローチするためのより良い方法はありますか?質問が過度に引き出された場合は、アドバイスと謝罪に感謝します。
r - 参照クラスを定義する R パッケージの構築
Rパッケージを作成しています。パッケージは、いくつかの参照クラスを定義します。1 つが基本クラスで、他のクラスがサブクラスであるため、クラス間には依存関係があります。この依存関係のため、パッケージ ファイルは特定の順序でロードする必要があります。最初に基本クラス、次にサブクラスです。しかし、運が良ければ、R は最初にサブクラスをロードし、基本クラスが定義されていないと不平を言っています。
パッケージのソース ファイルを特定の順序で強制的に実行するにはどうすればよいですか?
私の現在の「解決策」は、基本クラスを最初に定義して、すべてのクラス定義を1つのソースファイルに入れることです。醜い話。もっと良い方法があるはずです。
r - ロックされた変数を使用して R5 参照クラスをコピーする
フィールドの 1 つをロックしていない場合は R5 参照クラスをコピーできますが、フィールドの 1 つがロックされている場合はコピーされません。サンプル コードは次のとおりです (lock 呼び出しはコメント アウトされています)。私の質問: copy() メソッドを使用して、ロックされたフィールドを持つインスタンスのコピーを作成できないのはなぜですか?
r - 参照クラス内の参照クラスのインスタンス化 - lock() と不変性の問題
回避したいR参照クラスの動作に遭遇しました。次のコードでは、参照クラス B に参照クラス A の 2 つのフィールドがあります。
B のこれらのフィールドは、B のinitialize()
メソッドが呼び出される前に、参照クラス A のゼロ引数 (デフォルト) バージョンで (おそらく 2 回) インスタンス化されているように見えます。これらのインスタンスは、B の初期化プロセス中にインスタンス A の正しいバージョンに置き換えられます。問題は、lock()
B のインスタンス ジェネレーターから使用する場合、A の最初の空のインスタンス化を B で置き換えることができないことです。別の問題は、参照クラス A が初期化 [または Missing(c) テスト] で既定値を必要とすることです。
ヘルプ - 提案 - など。