問題タブ [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 - RでカスタムS3クラスのac()関数を作成する方法
私はRでS3クラスを書いています。これは、いくつかの属性が付加された単なる整数です。x1とx2がこのクラスのオブジェクト(「myclass」と呼びます)の場合、c(x1、x2)が元のクラス定義と属性をそのままにしたmyclassオブジェクトのベクトルを返すようにします。ただし、文書化されたc()の動作は属性を削除することであるため、独自のc.myclass()メソッドを作成する必要があるようです。私の質問は、どうすればこれを行うことができますか?
問題の例:
ここでは、結果は数値クラスのアイテムの単なるベクトルであり、元のn属性は失われています。
さまざまなパッケージのコードを見ると、次のようなコードが表示されることがあります。このコードでは、クラス属性を保持する必要がありますが、それ以外は何も保持しません。
残念ながら、これも機能させることができません。c.myclass(x1、x2)を呼び出した結果は、ベクトル自体がクラス "myclass"を持っているが、ベクトル内の各項目がクラスnumericを持っているベクトルです。ベクトル内の各アイテムにクラス「myclass」を持たせたいのです。実際には、他の属性(myclassの属性 "n"など)も保持するために、このメソッドをアップグレードする必要もあります。
oop - S1およびS2クラスとは何ですか?
RにはS3、S4があり、R 2.12では参照クラス(非公式にはS5クラスと呼ばれます)があります。
S1(またはS2)クラスのようなものはありますか?もしそうなら、彼らは何ですか?そうでない場合は、なぜS3から始めるのですか?
oop - is.objectとS3クラスシステム
このclass
関数を使用すると、オブジェクトのクラスを判別できます。
is.object
また、コマンドを使用して、オブジェクトにクラスがあるかどうかを判断できることも理解しています。ただし、一部のオブジェクトタイプは暗黙的です。つまり、
Rのすべての変数はオブジェクトでis.object
あり、非暗黙的なクラスのみのテストであると述べるのは正しいでしょうか?
また、タイプはこれにどのように適合しますか。素朴に、私は次のコードがエラーを生成すると思いました:
しかしx
、それでも「double」タイプがあり、それでもすべてが機能します。タイプは、他のすべてのオブジェクトが継承するスーパークラスと考えることができますか?
oop - R で汎用関数として sd を使用する
というクラスがある場合、関数foo
をオーバーロードするのは簡単ですsummary
sd
ただし、この手法は関数では機能しません。つまり、
この関数をオーバーロードする正しい方法は何ですか?
r - S3 印刷メソッドのオブジェクト名の取得に失敗しました
S3 クラス "bar" のオブジェクトと print メソッドを定義します。
今 print(foo) はこれを行います:
素晴らしいですが、自動印刷は失敗します:
これは、行がトップレベルの式として評価される方法と関係があると思います。R-develをすばやく検索しても無駄でした。誰でもそれを修正する方法を知っていますか?
名前が必要な理由は、定義しているものが関数であり、印刷メソッドに「try foo(2)」を配置できるようにしたいからです (オブジェクトの名前から「foo」を取得します)。はい、S3 で関数をサブクラス化できます。他にもピフォールがいるかもしれないと思います..
oop - S3メソッドをS4オブジェクトで機能させるにはどうすればよいですか?
S4オブジェクトを含む任意のRオブジェクトで動作するS3メソッドを作成しています。
私が最初に理解していないのは、S4クラスがS4基本クラスから派生しているようには見えないため、ディスパッチメソッドをf <- function(x) UseMethod("f")
宣言してすべてのS4オブジェクトを取得させることはできないということです。f.S4
(unclass
S4オブジェクトの場合、クラスが指定されているように見えますS4
。)ディスパッチをどのように管理する必要がありますか?
これらのS4オブジェクトを処理する最も簡単な方法は、それらをリストに変換することだと思われます。残念ながら、as.list
エラーがスローされます(「このS4クラスをベクターに強制変換するメソッドはありません」)。
これは私のテストS4オブジェクトです:
関数S3Part
とパッケージは有望に見えましたが、で使用すると両方ともエラーが発生しS3Class
ます。したがって、質問2は次のとおりです。S4オブジェクトをリストに変換する一般的な方法はありますか?methods
win
r - Rで「S3メソッド」とはどういう意味ですか?
私はRにかなり慣れていないので、S3のメソッドとオブジェクトが何であるかわかりません。S3とS4のオブジェクトシステムがあり、可能であればS4ではなくS3を使用することをお勧めするものもあります(http://google-styleguide.googlecode.com/svn/trunk/google-r-styleでGoogleのRスタイルガイドを参照してください)。 html)*。ただし、S3メソッド/オブジェクトの正確な定義はわかりません。
更新:2019年の時点で、GoogleのRスタイルガイドのハイパーリンクがここにあります。
oop - Rでクラス属性を失うマトリックス
次のコードを検討してください。
Aがサブセットの場合、「foo」クラスラベルが失われます。
同じことがベクトルでも起こります。ただし、data.framesでは同じことは起こりません。
そして通常、ジェネリック関数をオブジェクトに適用すると、クラス属性が保持されます。行列/数値/整数オブジェクト用ではありません。なんで?そして、この動作を回避できますか?
r - サブクラスからオーバーライドされた s3 メソッドを呼び出す (R.oo / R.methodsS3)
setMethodS3
パッケージ R.methodsS3 を使用して S3 メソッドを作成しています。2 つのクラスclass Parent
とclass Child
(R.oo オブジェクト) があるとします。 class Child
から継承しclass Parent
ます。両方とも方法がありMyMethod()
ます。Child's からスーパークラスMyMethod()
(Parent's )を呼び出すにはどうすればよいですか? this$MyMethod() を試しましたが、Child のMyMethod
MyMethod()
MyMethod()
縮小された例を次に示します。
r - RでS3ジェネリックを安全に作成する
Henrik Bengtssonは、2002年にS3ジェネリックがすでに作成されているかどうかを気にすることなく、RでS3ジェネリックを作成する優れた方法をインターネットに提供しました。
彼の関数setGenericsS3が行うことは、基本的に次のとおりです。
- 名前が正しいかどうかを確認します
- その名前の関数があるかどうかを確認してください
もしそうなら、
- ジェネリックかどうかを確認する
- そうでない場合は、名前を.defaultに変更し、ジェネリックを作成します
そうでない場合は、ジェネリックを作成するだけです。
このコードは、独自のパッケージに利用可能なジェネリックがない場合にジェネリックを自動的に作成するのに非常に役立つことがわかりました。私たちはこのRの時代をかなり過ぎて移動したので、今Rで同じことを達成するための正しい方法は何であるか疑問に思いました。Rで、または同様の関数を見つけることができませんisS3Generic()
。HenrikBengtssonのコードは、R2.14で導入された必須の名前空間よりずっと前からのものです。同じことを達成する他の方法を見たのを覚えていますが、それらを見つけることができません。
編集:私は特にS3を探しています。この関数isGeneric()
はS4でのみ機能します。たとえば、anova
(S3ジェネリック)の場合: