問題タブ [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 - data.table の := で ReferenceClass メソッドを呼び出す
この最小限の例が示すように、オブジェクトのメソッドを呼び出し、列 (バージョン 1.9.3、R バージョン 3.1) をReferenceClass
参照して戻り値を直接割り当てるのに問題があります。data.table
data.table
mdt[ , rf$get() ]
期待どおりに動作しmdt[ , list( z = rf$get()) ][ , z]
ますが、奇妙な結果がmdt[ , unlist(list( z = rf$get())) ]
得られ、エラーが発生します。
外で評価して結果を割り当てるrf$get()
mdt
ような解決策は必要ありません。私はここで何が起こっているのかを理解したいと思ってdata.tables
いReferenceClasses
ます.
r - roxygen2 はサブクラス コンストラクターの docstring を無視します
roxygen2 を使用して 2 つの参照クラスを文書化しようとしています。
ご覧のとおりYourclass
、 のサブクラスですMyclass
。RStudio にロードすると、次のようになりました。
どうやら roxygen は、サブクラス コンストラクターの docstring を無視するようです。私はここで何か悪いことをしていますか?
r - 同じ名前の参照クラス メソッド内でメソッド/関数を使用する
length
R で新しい参照クラスを定義する場合、(R の規則によって) 期待されるボイラープレート メソッドの束がありますshow
。メソッド。外部関数の名前空間を必ずしも知ることができないため、package::
指定子を使用することはできません。
.self$ を使用して特に呼び出されない限り、メソッドに独自のメソッドを無視するように指示する方法はありますか?
例:
または、代わりにクラスの S4 メソッドを定義することに頼ることもできますが (参照クラスは内部の S4 クラスであるため)、これは参照クラスのアイデアに反しているようです...
編集: データのクラスが事前にわかっているインスタンスに焦点を当てないようにするには、次の例を検討してください。
正しいメソッド/関数への独自のディスパッチを作成できることは承知していますが、これは非常に一般的な状況のように思われるため、メソッド パッケージ内で既に解決されている可能性があると考えていました (の逆のようなものですusingMethods()
) 。
したがって、私の質問は次のとおりです。これが以前に明確でなかった場合はお詫びします。メソッド定義内の参照クラスメソッドとフィールドを無視し、これらにアクセスするために .self のみに依存して、メソッド/関数がクラス外で定義されるようにする方法はありますか?マスクされていませんか?
r - R6 クラスの S4 ディスパッチ動作の不一致
実際の質問
R6クラスが (非公式の S3) クラスから継承するという事実
R6
は、まさにそのクラスの署名引数の S4 メソッドの定義を許可するべきではないでしょうか?これは - AFAICT - そうではないので、現在の S3/S4 標準に沿った回避策、またはそのような状況で「ベストプラクティス」と見なすことができる回避策は何ですか?
背景と例
参照クラス
参照クラスのすべてのインスタンスが継承するスーパークラス ( envRefClass
)でディスパッチするメソッドを定義する次の例を考えてみます。
class()
この継承構造は、その事実を明らかにしないため、直接明らかではありません。
ただし、クラス ジェネレーター オブジェクトの属性を見ると、次のことがわかります。
だからディスパッチは機能する
R6 クラス
R6 クラスに同様のことをしたい場合、(参照クラスと比較して) 最初はそのように見えても、物事は単純ではないように見えます。
「単純に見える」とは、すべての R6 クラスが、メソッド ディスパッチのスーパークラスとして使用できるclass()
クラスから継承することを実際に示唆していることを意味します。R6
のヘルプ ページでR6Class()
は、クラスR6
がclass = TRUE
. これが、このクラスの S4 メソッドを定義しようとすると警告が表示される理由でもあります。
したがって、これにより、基本的に2つの可能なオプション/回避策が残ります。
- クラス
R6
を正式なクラスに変えるsetOldClass()
- R6 クラスのすべてのインスタンスを他のスーパークラスから継承させます。たとえば、
.R6
広告 1)
これは、クラス テーブル/グラフで S3 スタイルをハッキングするときに機能します。
ただし、実際の R6 クラス インスタンスでは失敗します。
広告 2)
結論
アプローチ 1 の並べ替えは、S3 と S4 にある程度の互換性を持たせるために「グレー エリア」で動作しますが、アプローチ 2 は、IMO が機能する完全に有効な「純粋な S4」ソリューションのように見えます。Rでの非公式/公式クラスとメソッドディスパッチの相互作用に関して、R6クラスの実装に矛盾があるかどうかという問題を提起することにはならなかったという事実.
r - Rで関数をサブクラス化する方法は?
参照クラスを使用して R の関数をサブクラス化できるかどうか疑問に思っていました。たとえば、次のようになります。
問題なく動作します (エラーをスローしません) が、動作をカスタマイズするにはどうすればよいですか (つまり、 を返す以外にNULL
)? 関数の引数を定義するにはどうすればよいですか?
私も試しました
しかし、それはうまくいかないようです。
関数をサブクラス化できるということは、関数呼び出しの前後にカスタム動作を実装できることを意味することを望んでいました。たとえば、(監査目的で) 呼び出されるたびに call 式を自動的にログに記録する関数を作成したり、NULL
が返された場合に自動的にエラーをスローする関数を作成したりします。
r - R参照クラスの多重継承:特定の親クラスでメソッドを呼び出す方法は?
Child
親から継承する参照クラスSuperA
とSuperB
. のinitialize
メソッドでは、との両方Child
のメソッドを順番に呼び出したいと思います。initialize
SuperA
SuperB
したがって、たとえば、私は持っています:
ただし、私が得るのは次のとおりです。
では、特定の親に属するメソッドを呼び出す方法についてアイデアを持っている人はいますか?
r - R は、参照クラスが参照クラスのメンバーであることを許可します
「class1」を「class2」の要素にしようとしています。しかし、「class1」にinitialize()
関数がある場合、次のエラーが発生します。
.Object$initialize(...) のエラー: 引数 "a" がありません。デフォルトはありません
r - initFields(scales = scales) のエラー: 関数 "initRefFields" が見つかりませんでした
コードの一部として ggplot2 プロット関数があります。ファイルが R コードとして供給されている場合、関数は正常に動作しますが、この関数を R パッケージに含めると (もちろん、説明とパッケージの名前空間ファイルの両方に ggplot2 とスケールを含めます)、次のようになります。エラー:
ggplot2 オブジェクトのスケールのそれぞれの呼び出しは次のとおりです。
ソースからインストールされた最新の R (3.2.0) と最新の ggplot2 (1.0.1) を実行します。
可能な解決策/説明をいただければ幸いです。
編集: の出力sessionInfo()
は次のとおりです。
これ.libPaths()
は、私のインストールでもかなり一般的です。
scales
おそらく、コマンド ライン R スクリプトからパッケージを必要とする関数を呼び出すことも追加する必要があります。
(もちろん、R 2.14に戻すことを除いて)すべての推奨事項を試しましたが、何も機能しなかったため、initFieldsのggplot2エラーの複製ではありません)。
r - R の多重継承における参照クラス
Rには3つの参照クラスがあります。それらをA、B、Cと呼びましょう。C は A と B の両方からフィールドを継承しますが、C の初期化メソッドに callSuper() を配置すると、この関数は A の初期化メソッドのみを呼び出し、B から継承されたフィールドは初期化されません。
Cのすべてのフィールドを初期化するにはどうすればよいですか??
r - R の参照クラス: 含まれている変数を取得する
それ自体が参照クラスであるフィールドを持つ R の参照クラス定義があるとします。
参照クラスのインスタンスは、.self で自分自身を参照できます。それらをフィールドとして含む参照クラスのインスタンスを参照できますか。つまり、この例では、B のインスタンス内に含まれる A のインスタンスが B を参照できますか? もしそうなら、どうすればこれを行うことができますか?
ありがとう、ベン。