問題タブ [s4]
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.
class - Rのクラス:S3対S4
Rでクラスを作成したいのですが、S3またはS4クラスを使用する必要がありますか?
私はそれらについて多くの異なることを読みました、他のものより優れているものはありますか?
r - data() を汎用 S4 関数として使用する
クラスの新しいdata
メソッドを定義しようとしています。foo
私foo
のオブジェクトは次の構造に従います。
data
私が作成しようとしているメソッドは、実際にはスロットの内容にアクセスしています@data
:
Writing R Extensions マニュアルのセクション 7.1を見てきましたが、S3 クラスしか扱っていません。私もこの投稿をのぞき見しましたが、成功しませんでした:
パッケージをロードするとき:
oop - 別のオブジェクトが返されるように S4 オブジェクトを初期化する方法はありますか?
オブジェクトが存在しないスーパークラスを持つクラス階層がありfb
ます (仮想クラスを試しましたが、仮想クラスからオブジェクトを初期化できないという問題が発生しました)。さらに、同じスロットを持つ 2 つのサブクラス ( foo
、 ) があります。bar
ここで、値に基づいてサブクラスの 1 つのオブジェクトを返すスーパークラスの初期化メソッドを使用して、新しいオブジェクトを作成したいと考えています。
明らかに (そしておそらく正当な理由で) R はそれを許可していません。新しいオブジェクトを作成するときに if-else コンストラクトを使用せずに、メソッド内で目的を達成する方法はありますか?
r - R で S3 オブジェクトと S4 オブジェクトをプログラムで区別する
object が与えられた場合、それがor (または「その他」)x
であるかどうかを分類する方法はありますか? 私は と を見て、何かがオブジェクトである (またはそうでない) ことと、それが S4 オブジェクトである (またはそうでない) ことを識別できます。ただし、S3 オブジェクトが S4 オブジェクト以外のすべてのオブジェクトを補完するものであるとは思えません。S3
S4
is.object()
isS4()
したがって、これらの割り当てをプログラムでどのように行うことができますか?
のヘルプから抜粋した、私を悩ませているものの例を次に示しますis.object()
。
それa
はS3
オブジェクトということですか?
r - 引数として式を使用してS4メソッドをディスパッチする
S4メソッドに式を引数として使用するように説得しようとしていますが、常にエラーが返されます。私がここでやろうとしていることを少し説明する簡単な例:
私が今試してみると:
私が正しく理解していれば、引数はすでにジェネリックで評価されているようです。したがって、式をメソッドに渡すことは、少なくとも注意が必要なようです。式を使用してS4ディスパッチメソッドを使用する可能性はありますか?
編集:より良い例であるため、変換に変更されました。
oop - RでcallNextMethod()を使用して引数を渡す際の問題
私の質問:
callNextMethod()
次のメソッドに期待どおりに引数を渡さないのはなぜですか?
状況:
2つの階層クラスがfoo
あり、bar
(bar
のサブクラスはfoo
)foobar
両方のクラスにディスパッチできるメソッドがある(つまり、両方のクラスのメソッドがある)とします。
さらに、(サブ)クラスのメソッドは、を使用していくつかの計算を行った後bar
、のメソッドを呼び出します。foo
callNextMethod()
どちらのメソッドにも同じ追加の引数(デフォルト)があり、これはのメソッドに渡される必要がfoo
あります。ここで、それだけが関係します。
問題
の説明:引数は期待どおりに渡されませんが、デフォルト値はメソッド定義から取得されます。具体的には、最初のメソッドでは、引数は呼び出し(TRUE
)で指定されたとおりですが、次のメソッドではに変更さFALSE
れます。
与える
another.argument
次のメソッドに渡して、メソッドTRUE
の呼び出しにも含まれるようにしますfoo
。
期待どおり?callNextMethod
に機能するはずです(つまり、名前付き引数は呼び出しの場合と同じように渡されます)。
元の呼び出しに表示される仮引数、たとえばxの場合、次のメソッド呼び出しにはx=xに相当する対応する引数があります。実際、これは、次のメソッドが同じ実際の引数を参照するが、引数は1回だけ評価されることを意味します。
2番目の質問:another.argumentを次のメソッドに渡すにはどうすればよいですか。(私は本当に両方のメソッドでデフォルトの引数を保持したいと思います)
r - Rでパッケージを開発するには?
R
S4 クラスを使用していくつかの関数を作成しました。
R
ここで、これらの関数からパッケージを作成したいと思います。
どのように進めればよいですか?S4 クラスを使用しているため、別の方法で行うべきことはありますか?
r - roxygen2を使用してS4メソッドを適切に文書化する方法
これがRoxygen2の将来のバージョンでどのように行われるべきか、または行われるかについて、SOや他の場所でいくつかの議論を見てきました。しかし、私は立ち往生しています。Roxygen2を使用して、S4ジェネリックとそのメソッドを文書化するにはどうすればよいですか?まったく新しいジェネリック/メソッドの実用的な例、およびベースS4ジェネリックを拡張するための例は非常に役立ちます。同じジェネリックのS4メソッドごとに個別の(ほとんど)冗長なドキュメントを作成する必要はありません。
デューデリジェンス:「抽出」方法の有用な例を追跡しました。しかし、私の質問では時代遅れで不完全なようです。クラスのドキュメントで@slotタグを使用しますが、これは(もはや?)サポートされていません。これは、S4ジェネリックのドキュメントを含む完全なRoxygenの例ではなく、コアS4メソッド「[」の拡張のみを示しています。
roxygenを使用してS4"["および"[<-"メソッドを適切に文書化する方法は?
タイトル、説明を使用して新しいS4ジェネリックを完全に文書化し、@param @return @name @aliases
@docType @rdname
次に対応するだけを使用してS4メソッドを文書化すると@name @aliases
@docType @rdname
、次のR CMD check
警告が表示されます。
最初は、roxygen2を使用してこの方法で文書化された私のS4メソッドのいずれも実際には機能しなかったかのように見えました。ただし、これまでのところ、コアメソッド「show」の拡張機能には、他のメソッドとまったく同じ方法で文書化されていても、関連するエラーがないことに気づきました。これは、showメソッドの1つの上に含めた、ドキュメントの欠落エラーを生成しなかった完全なroxygenドキュメントの例です。
したがって、私は途方に暮れています。ご覧のとおり、RパッケージマニュアルのS4ドキュメントセクションで説明されているS4メソッドのエイリアスの規則を含めました。つまり、メソッドには次の名前(スペースなし)のエイリアスが必要です。
どういうわけか、これはによって完全に理解されていませんR CMD check
。
最後に、以下を使用してドキュメントを作成した後:
パッケージをビルドすると、機能するドキュメントが得られます。特定のメソッドのドキュメントのタイトルは、「説明」フィールドに表示されますが、かなり厄介です。したがって、roxygen2は明らかに各メソッドのドキュメントで何かを行い、正しい方向に進んでいます。ただし、からの大きくて厄介な警告を回避するだけでは十分ではありません。
私はRdファイルを見てきましたが、問題が何であるかをすばやく確認するためにそれらについてはさらに詳しく知りません。とにかく、ドキュメントの改訂の直後にRdファイルを操作する必要がないように、roxygen2ソリューションを知りたいと思います。
したがって、これは複数の部分からなる質問です。
roxygen2を使用したS4ジェネリックとS4メソッドの両方のドキュメントに現在推奨されているアプローチは何ですか?
完全な詳細を示す良い例がどこかにありますか?
ほとんどのS4メソッドのドキュメントが欠落しているという警告の原因と解決策は何でしょうか(ドキュメントが「欠落している」メソッドは実際にroxygen2によってドキュメントが解析されており、結果のRdファイルは少なくとも十分に機能します)後のパッケージで
R CMD build mypkgname
)?
class - Roxygen2を使用してS4クラススロットを適切に文書化する方法は?
roxygen(2) を使用してクラスを文書化する場合、タイトルと説明/詳細を指定することは、関数、メソッド、データなどと同じように見えます。ただし、スロットと継承はそれ自体が一種の動物です。roxygen2 で S4 クラスを文書化するためのベストプラクティス (現在または計画中) は何ですか?
適当な注意:
@slot
roxygen の初期の説明でタグ
の言及を見つけました。2008 年の R-forge メーリング リストへの投稿
は、これが死んでいることを示しているようで@slot
、roxygen ではサポートされていません。
これはroxygen2に当てはまりますか?前述の投稿では、代わりにユーザーが LaTeX マークアップを使用して独自の項目別リストを作成することを提案しています。たとえば、クラスを拡張する新しい S4 クラスは、次の"character"
ようにコーディングおよびドキュメント化されます。
ただし、これは機能しますが、スロットを文書化するためのこのアプローチは\describe
、\item
で区切られた@
タグがなく、スロットが文書化されず、roxygenize()
. また、定義されているクラスの継承を文書化する一貫した方法についても何も述べていません。@import
タグを使用すると、依存関係は一般的に正常に機能すると思います(特定のスロットが別のパッケージの非基本クラスを必要とする場合) 。
要約すると、roxygen(2) スロットの現在のベストプラクティスは何ですか?
現時点では、次の 3 つのオプションを検討する必要があるようです。
- A -- 項目別リスト (上記の例のように)。
- B --
@slot
... しかし、余分なタグや実装を見逃していました。上記の例の項目別リストの代わりとして @slot が含まれていたバージョンでは、@slot を roxygen / roxygen2 で動作させることができませんでした。繰り返しますが、上記の例は roxygen(2) で機能します。@param
C --同じことを達成する、スロットを指定するための代替タグ ( など)。
githubroxygen2
の開発ページに作成した投稿からこの質問を借用/拡張しています。
r - Rでスロットのデフォルト値をNULLに設定するには?
私はRが初めてです。
ツリー ノードに似たクラスを定義しようとしています。つまり、左ノードと右ノードがあり、親ノードと同じクラスである必要があります。したがって、クラスを次のように定義します。
プロトタイプを設定して Node のデフォルト値を NULL にしたいのですが、R は次のように言っています。
しかし、デフォルト値を NULL に指定しないと、デフォルト値は深さ 4 の再帰ノードになり、リソースの無駄遣いになると思います。
私の考慮は不要ですか、それともより良い方法はありますか?