問題タブ [r-s3]
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 - 「Median」という名前の S4 メソッドの作成
ここで、上位の回答は、S3 オブジェクトと S4 オブジェクトの両方でメソッド ディスパッチを行う良い方法を説明しています。ただし、この方法は、両方のメソッドの署名が同じ場合にのみ機能します。
median
別の署名でS4 メソッドを作成する方法はありますか?
たとえば、次は機能しません。
ライブラリのインストール時に、元の中央値関数の引数である仮引数と が欠落しているというエラーが表示さx
れます。na.rm
著者の投稿の上部にある解決策は避けたいと思います。
r - class(data.frame(...)) がリストの継承を表示しないのはなぜですか?
data.frame
はから継承されているとよく言われますが、data.frame 列 ( 、など)list
にアクセスするための多くの一般的なパラダイムを考えると、これは理にかなっています。$
sapply
まだ、オブジェクト"list"
のクラス リストで返されるアイテムの中にはありません。data.frame
a のクラスを解除するdata.frame
と、それがリストであることを示します。
また、data.frame メソッドがない場合、リスト メソッドよりも優先してデフォルト メソッドが呼び出されるようにテストします。
次に2つの質問:
data.frame
正式な継承の失敗はlist
、設計の観点から何か利点がありますか?data.frame
s をリストとして扱っているように見える関数は、それらをリストとして扱うことをどのように知っているのでしょうか? これを見るlapply
と、C の内部コードにすぐに移行するように見えるので、おそらくそれだけですが、ここで少し頭がおかしくなりました。
r - 参照クラスの機能インターフェース
クラス (または実際には S4/S3 クラス) を参照するための機能的なユーザー インターフェイスを提供することの概念的な意味を理解しようとしています。要するに、以下のようなコードを書くと、関数型のコードを書いているのと同じになるのではないかという懸念があります。
以下は単純な線形回帰クラスです。
オブジェクト指向のインターフェイスはあまりユーザー フレンドリーではないため、Martin Morgan のスライドのように、基になる参照クラスの機能的なユーザー インターフェイスを作成します。
現在、この機能的なインターフェースは、純粋に機能的なインターフェースと観察的に同等です
これが私の例が病理学的に単純なためかどうかを理解しようとしていますが、参照クラスを作成して関数インターフェイスにラップすることと、純粋に機能的なコードを作成することに意味があるかどうかはまだ疑問です。
詳細な例は非常に役立ちます。
r - S3サブセット演算子の割り当て
「Data」と呼ばれる S3 クラスで動作するライブラリを作成しており、サブセット演算子を割り当てる必要があります。[.Data
関連する R ファイルには、次のものがあります。
ライブラリのインストールに問題はありませんが、インタラクティブな R セッションでライブラリをアタッチすると、関数[.Data
が見つかりません。上記の R ファイルのコードをコピーして端末に貼り付けるだけで、関数が定義され、期待どおりに動作します。
さらに、リソース R ファイル内の関数の名前を から[.Data
のような標準名に変更fun
すると、R セッションでライブラリをアタッチしたときに関数を見つけることができます。したがって、ライブラリをインストールする際にファイルを照合するのに問題はないと思います。
また、成功しないassign
代わりに、より明示的な関数を使用してみました。<-
問題は関数の名前に限定されているようですが、S3 の制約により、機能を変更せずに関数の名前を変更することはできません。
r - 警告をマスキングせずにパッケージを強制的にアタッチする
ライブラリがアタッチされるたびに、名前の衝突やマスクされたオブジェクトに関する警告をスローしないように指定する方法はありますか? 解決策には、説明または次のような特別な機能の1つを編集することが含まれると.onAttach
思いますが、この問題を解決するものは何も見つかりません。
警告は不要なのでお願いします。独自のS3
クラスを定義しましたが、マスクされた関数は依然としてマスキング関数のデフォルト メソッドによって呼び出されます。
ユーザーがベクターなどの典型的な R データ構造で中央値を使用している場合median
、私のパッケージのメソッドはマスクされた関数を自動的に呼び出すため、ユーザーがマスキングを意識する必要はありません。
r - S3オブジェクトを返さずに変更しますか?
R でのオブジェクト指向プログラミングは初めてで、オブジェクトを変更する関数を適切に記述する方法に苦労しています。
この例は機能します:
しかし、オブジェクト全体を返さずにこれを行うためのよりクリーンな方法があるはずです。
Rで変更関数を書く適切な方法は何ですか? 「<<-」?
更新: R で OOP のロゼッタ ストーンになったものに感謝します。非常に有益です。私が解決しようとしている問題は、フローの点で非常に複雑であるため、参照クラスの厳格さが構造を助けてくれる可能性があります。1つだけではなく、すべての回答を回答として受け入れることができれば幸いです。
r - OOP および S3 メソッドを使用して検出し、data.frame の単一のベクトルまたはすべての列を操作します。
単一のベクトルを操作する関数を作成しました。ときどきその機能をまるごと使いたくなるdata.frame
。sapply
関連する変数全体を使用することでそれを達成できますが、S3 メソッドを使用して関数を含めて指示する必要があります。
まず、セットアップ:
したがって、単一のベクトルでは、関数は機能します。
しかし、全体を渡すことdata.frame
はできません:
問題が何であるかは明らかです-adder
私たちが全体を見ていることを検出しdata.frame
、「複数の」メソッドを使用し、それが「単一の」メソッドと引数from
を呼び出しto
て渡されていません。
Hadley Wickham のOOP Field GuideとNicolas Christian のAdvanced Programmingを読みましたが、私には合いませんでした。S3 メソッドを使用する限り、まったく異なるアプローチを歓迎します。この演習の一部は、S3 メソッドの使用方法を学習するためです。
r - R S3 で cat をディスパッチするにはどうすればよいですか?
OK、これをジェネリック cat に追加します。
サイコロはありません。
r - S3*data.frame でカスタム メソッドをディスパッチする
新しい S3 クラスのオブジェクトを使用して data.frame を乗算するための独自の動作 (メソッド) を定義したいと考えています。しかし、メソッドディスパッチを取得してメソッドを見つける方法がわかりません。方法はありますか?
まず、S3 オブジェクト 'a' (oldClass "A") と 'df' (oldClass "data.frame") を定義します。
次に、trace(Ops.data.frame, edit=TRUE) を使用して、最初の行に print("Ops.data.frame") を追加します。このようにして、Ops.data.frame がいつ呼び出されるかがわかります。ここにデモンストレーションがあります:
クラス「A」の S3 メソッドを定義できます。
これは a に対して呼び出されますが、 dfに対しては呼び出されません:
それではうまくいきません。
代わりに S4 メソッドを使用するのはどうですか? これには S4 クラス "A" を定義する必要がありますが、通常、oldClass "A" を持つ S3 オブジェクトは S4 ディスパッチによって引き続き検出されます。
ただし、それは Ops では機能しません。
dfのこの動作は、 Martin Morgan ( https://stackoverflow.com/a/12101238/3203184 ) と ?Methods によって説明されています。S3 ジェネリックが直接呼び出された場合、S4 メソッドは決して見つからないと言っています。a と df の両方が S3 オブジェクトであるため、これは df で発生しているように見えます。
setOldClass
また、 ;を呼び出すことも役に立ちません。問題は、S3 オブジェクトがS4 メソッドのディスパッチによって認識できないことではなく、2 つの S3 オブジェクトが のようなメソッドに渡されたときに検索されないことです*
。これらのケースでは、S3 ジェネリックが直接呼び出され、S4 ラベル付けが S4 ディスパッチにつながることはありません。
だから今、私は途方に暮れています。S3 オブジェクトの S4 メソッドを発見する方法が見つかりませんでし*
た。また、data.frame メソッドに取って代わる S3 メソッドを作成する方法も見つかりませんでした。
スカラーを S4 オブジェクトにしたい場合は、必要なディスパッチを取得できます。
しかし、私は本当に「a」を S3 オブジェクトとして保持したいと考えています。(1) 'a' を S3 にする方法と (2) Ops('A', 'data.frame') の独自のメソッドを定義する方法はありますか?
r - 一度に複数の値を環境に割り当てる
環境が与えられた場合x
、 の便利な略記assign(x, value, envir = e)
は と書くことe[[x]] <- value
です。現在、複数のオブジェクトを一度に割り当てるためのサブセット演算子に相当するものはありません。
の組み込みの S3 機能を使用して作成することを望んでいました[<-
。私が最初に気付いた奇妙な点は、 S3 関数を模倣しているにもかかわらず、[[<-
と[<-
が原始関数であるということです。
通常、S3 関数は、本体が単なる呼び出しである形式になっていますUseMethod
。例えば:
代入演算子がプリミティブであることに加えて、[[<-
for classの S3 メソッドはありませんenvironment
。
[[<-
したがって、プリミティブ関数にそのようなデフォルトがある場合、使用する元の割り当てはデフォルトを使用して行う必要があります。それにもかかわらず、私は S3 関数を実装しました[<-.environment
:
これは、以下に対して正しく実装されているかのように動作するように見えます。
ただし、同じエラーが発生します。
[<-
と の S3 メソッドとの不一致と、[[<-
環境のサブセット割り当てを正しく実装する方法の両方を誰かが説明できますか?