問題タブ [r6]
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 - 参照による xts 割り当て
持ってみましょう:
オブジェクト スロットにを割り当てdata.table
て外部データ テーブルを変更すると、オブジェクト スロットのデータ テーブルも参照によって変更されます。
で同様の実験をしましょうxts
:
この方法でオブジェクト スロット内にオブジェクトを割り当てるxts
と、 とは異なり、スロットと外部オブジェクトの間のリンクが壊れているように見えますdata.table
。
xts
参照によって共有されていることを達成することは何とか可能ですか?
r - 関数を r6 クラス インスタンスに動的に追加する
refclasses (R5) を忘れて R6 に移行しようとしていますが、動的コードに問題があります。新しい関数を追加すると、R5 で動作します。
同様のコードは R6 では機能しません。
クラス定義に予測を追加しても何も変わらず、同じエラーが発生します。 解決策はありますか?前もって感謝します。
追加: @G.Grothendieck の素晴らしい回答の後、文字列ベースの関数定義がありますが、もっとエレガントなソリューションがあるかもしれません。
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 - R6 クラスの静的メソッド
R6 クラスに静的メソッドを追加する方法はありますか? たとえば、次のように呼び出すことができる関数
それ以外の
r - 継承を維持しながら R6 クラスの S4 相当物を登録する
実際の質問
すべてのクラスが ( ではなく) パッケージの名前空間に存在する必要がある場合、継承構造を保持しながら、相互に継承する一連の R6 クラスを S4 クラスに変換するにはどうすればよいGlobalEnv
ですか?
詳細
R6 クラスが で定義されていて.GlobalEnv
( でソーシングする場合source()
など)、setOldClass()
で呼び出されている場合は、すべて正常に機能しwhere = .GlobalEnv
ます。
しかし、パッケージの名前空間内で R6 クラスが定義されている場合 (を呼び出す場合devtools::load_all()
など) 、動作させることができません。
での R6 クラスの定義.GlobalEnv
:
setOldClass()
で呼び出すwhere = .GlobalEnv
( のデフォルトwhere
):
R6 クラスがパッケージの名前空間内で定義されている場合 (のdevtools::load_all()
代わりに「ソース」を使用する場合などsource()
)、明示的な を提供することでそれを説明する必要があると想定しましたwhere
。
ただし、次のエラーが表示されます。
setOldClass(c("Module", "Api"), where = where) のエラー: 「Module」の古いスタイルのクラス情報に一貫性がありません。クラスは定義されていますが、「Api」を拡張しておらず、データ部分として有効ではありません
再現性の促進
この問題をできるだけ簡単に再現できるように努めたので、私のGitHub リポジトリr6.s4
でパッケージを見つけることができます
エラーを再現するには、実行 (または RStudio でdevtools::load_all()
ヒット)する必要があることに注意してCRTL + SHFT + L
ください。
また、この単体テストは、何が起こっているのかを理解するのに役立つ場合があります。
r - R6 オブジェクトは parallels パッケージと互換性がありますか?
R の S4 アプローチを OOP だけに残すことを考えており、新しい R6 パッケージで OOP を使用してみたいと考えています。今知りたいのは、パッケージ R6 を使用して構築しているオブジェクトは、「並列」パッケージと互換性がありますか? 皆さん、ありがとうございました。
r - R のベクトルの参照によるサブ代入
どういうわけか、原子ベクトルで参照によるサブ割り当てを使用できますか?
もちろん、それを1列にラップせずに data.table を使用します:=
。
R6がそれを助けることができるなら、それはすでに私の開発者の1つであるので、私はR6ソリューションに対してオープンです。内部オブジェクトがまだ copy: gist
を作成
していることを既に確認しました。<-
R6