問題タブ [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.
r - RのS4オブジェクトをFortranに渡すことはできません
bdiag
Rのパッケージ内の関数を使用してMatrix
対角行列を生成し、結果の行列(と呼ばれるmat
)を自己記述関数に渡しますが、次のエラーのためにRを実行できません。
Error: invalid mode (S4) to pass to Fortran (arg 1)
確認isS4(mat)
したところTRUE
です。したがって、関数に渡すためにS4オブジェクトを何らかの方法で変換する方法があると思います。どんなアドバイスも大歓迎です!
更新:ブロック対角行列を作成するために次のコードを使用します。
bdiag
関数を使用せずにS3行列を取得する他の方法はありますか?ありがとう!
r - R で S4 オブジェクトのスロットにアクセスする方法
プログラムでウェーブレットを使用しており、パッケージwavelets
を使用して、関数を使用して時系列の DWT を作成していますdwt
。この関数は、クラス のオブジェクトを返します。これは、、、、、などの多くのスロットをdwt
持つ S4 オブジェクトです。W
V
levels
filter
W
にベクトルとしてアクセスするにはどうすればよいですか?
multithreading - S4 クラス内で並列クラスターを作成する
重複の可能性:
S4 クラス: スロットごとに複数のタイプ
初めての R パッケージを作ろうとしています。データとデータを処理するいくつかのメソッドを含む S4 クラス「テスト」を作成する予定です。私の場合、データの処理はマルチスレッドによって改善できます。テストparLapply()
しましたが、パフォーマンスが向上します。
問題は、私が電話したくないということです:
並列にしたい各メソッドで。これは、エレガントではなく、スレッドのチームの作成 (および破棄) の繰り返しにコストがかかるためです。
cluster
したがって、クラス「テスト」内に(単に)オブジェクトを持つことを考えていました。次に、たとえば、「テスト」オブジェクト「o」を作成し、「テスト」のメソッドを呼び出すことができますsetNumbrOfThreads(o) <- 4
。
ただし、実装に問題があります。?makeCluster()
戻り値は '''An object of class 'c("SOCKcluster", "cluster")''' であると述べているので、試してみました:
Rはそれを不平を言ったelement 3 of the representation was not a single character string
。だから私はそれ以上成功せずに試しました:cluster = "cluster"
またはcluster = "SOCKcluster"
(表現で)。
私の質問は:
クラス c("SOCKcluster", "cluster") のメンバーオブジェクトを持つ S4 クラスを作成するにはどうすればよいですか?
ありがとうございました、
r - S4 コードが関係している場合、testthat::auto_test() が失敗するようです
ここ数週間、私はtestthatパッケージの単体テスト機能を日々の仕事にますます統合してきました。
コードのどこかを変更するたびに、すべての単体テストを自動的に実行する autotest-feature が特に気に入っています。ただし、コードディレクトリに S4 定義 (クラス、ジェネリックメソッド、カスタムメソッド) が含まれている状況でtestthatの関数を使用すると、小さなバグまたは少なくとも望ましくない動作に遭遇したと思います。auto_test()
質問
この動作はバグの下に示されていますか、それとも使用時に何か間違ったことをしていauto_test()
ますか?
以下に、最初にいくつかのサンプル ファイルを作成する必要がある図を示します。
予選
作業ディレクトリを設定
ディレクトリを確保する
S4 参照クラス定義の作成
classes.R
ディレクトリにファイルを作成しますsrc
ジェネリック メソッド定義の作成
generics.R
ディレクトリにファイルを作成しますsrc
カスタム メソッド定義の作成
methods.R
ディレクトリにファイルを作成しますsrc
単体テストを作成する
ファイルtest_getName_ref.R
とtest_setName_ref.R
ディレクトリを作成しますtests
図
実行auto_test()
するとエラーが発生します。
私の最初の推測ではtestthat::source_dir()
、おそらく引数のために、ソーシングを処理する方法に関係があるのではないでしょenv
うか?
続行するには、CRTL + BREAK で自動テストをオフにする必要があります (Windowsの場合。他のプラットフォームを使用している場合は、この記事のセクション「自動テスト」を参照してください)。
ここで、最初にコードを手動でソースして実行するtest_dir()
と、すべて正常に動作するように見えます。
r - 他のパッケージのS4メソッドを拡張するときにRdファイル名が競合する
実際の質問
Rdファイル名の競合を回避するにはどうすればよいですか?
- S4ジェネリックとそのメソッドは必ずしもすべて同じパッケージで定義されているわけではありません(カスタムメソッド(の一部)を含むパッケージはジェネリックを含むパッケージに依存します)
roxygenize()
パッケージroxygen2から実際のRdファイルを生成するために使用しますか?
ジェネリックとそのメソッドがパッケージ全体に散在している場合、これがroxygen2
問題なのか一般的な問題なのかはわかりません(モジュラープログラミングスタイルに従う場合、IMHOは一般的に現実的なユースケースシナリオです)。
これらの状況を処理するための推奨される方法は何ですか?
図
パッケージ内pkga
パッケージpkga
でジェネリックメソッドを定義し、Rdファイルを生成するためにfoo
取得するそれぞれのroxygenコードを提供したとします。roxygenize()
roxygenizing()
パッケージを作成すると、このジェネリックメソッド用に作成される可能性のあるすべてのメソッドの参照Rdファイルとして機能するファイルがサブディレクトリに作成foo-methods.Rd
されます。man
ここまでは順調ですね。このジェネリックのすべてのメソッドもパッケージの一部である場合、すべてが良好です。たとえば、このroxygenコードは、次foo-methods.Rd
のANY
-methodのドキュメントが追加されていることを確認しfoo
ます。
ただし、パッケージpkga
がのジェネリックを提供し、foo
他のパッケージ(たとえば)でクラスであるための-メソッドpkgb
を追加することを決定した場合、Rdファイル名および/またはエイリアス( )にRdファイルがすでに存在します:foo
x
character
R CMD check
foo-methods.Rd
pkga
パッケージ内pkgb
より正確には、これはファイルにスロー/書き込まれるエラーです00install.out
デューデリジェンス
(の代わりに)との値を変更しようとしましたが@rdname
、roxygenizing時に設定されているため、エラーが残ります。によって生成されたRdファイルを手動で編集する以外のアイデアはありますか?@aliases
foo_pkgb*
foo*
\title
\name
foo
roxygenize()
2012年12月1日編集
バウンティを開始することに照らして、実際の質問は少し広い味を得るかもしれません:
Rdファイルに関してある種の「パッケージ間」チェックを実装するにはどうすればよいですか。また、パッケージ全体に散在するS4メソッドヘルプファイルを1つのRdファイルに統合して、最後に単一の参照ソースを提示するにはどうすればよいですか。 -ユーザー?
r - R:data.frameを継承するS4オブジェクトにterms.formulaを適用する
データフレームから継承する新しいクラスを作成しようとしています。
これは、テスト用のそのクラスのインスタンスです。
それが大丈夫に見えることを確認するためだけに...
...そして継承が機能したことを確認する
データフレームであるという特性を利用しようとしたときに遭遇した問題は次のとおりです。
私は愚かな何かを逃したかもしれません。もしそうなら、それを指摘してくれてありがとう。
ここでの問題について正しければ、とにかくterms.formulaにdata.frameを与えているという事実を認識させることができますか?
r - ベクトルのようなインデックス付けを可能にするRでS4クラスを作成する方法は?
ベクトルのすべての要素に「開始時間」と「終了時間」の2つの追加属性があることを除いて、基本的にベクトルクラスのようにする必要があるRで新しいクラスを作成したいと思います。機能の一部は、あらゆる種類の従来のインデックス作成である必要があります。
ここに少なくとも少しのコードを提供することは、私が試したものです:
これは明らかに機能しません
と
example[1:3] たとえば、 NA NA NA が得られます。
または、次のようなものから始まるゲッターを自分で作成する必要があります
? もちろん、引数 x,i,j,drop を正しく処理する方法がわからないため、これを避けたかったのです。
スロット「番号」は必要ですか? 省略できる仮想クラス ベクトルから継承する方法はありますか? さらに、数値を含むベクトルの構造を制約したくありません。
この質問が些細なことではないことを願っていますが、自分で解決策を見つけることなく、本やpdfのさまざまな章を読みました。
よろしくお願いします。
みか
r - roxygen2を使用するときにS4メソッドをロードする順序を指定する方法
私はすでに何度も次の問題に遭遇しました。
2つのクラスがclassA
ありclassB
、次のファイルで説明されているとしますclassA.R
。
とclassB.R
これらのファイルは、によってアルファベット順に読み取られたと思いますがroxygen2
、そうではありません。パッケージをビルドしようとすると、次のエラーが発生する可能性があります。
roxygenize()
ファイルを読み取る順序、つまりどのクラス定義を他のクラス定義よりも先に読み取る必要があるかを確認するにはどうすればよいですか?
注:私は自分の質問に答えたことを知っています。これは、私がこの問題に頻繁に遭遇し、のコードを見て、これを行うための適切な方法を実現したためですroxygen2
。参考までに、これが私の調査結果です。
r - S4 参照クラスのインスタンスのデフォルト フィールド値の定義
S4 Reference Classesインスタンスのフィールドのデフォルト値を定義するにはどうすればよいですか?
通常の S4 クラスの場合、次のprototype
引数があります。
のヘルプページを理解している限り、これは引数setRefClass
を介して S4 参照クラスでも機能するはずです。...
それぞれのセクションには次のように記載されています。
... setClass に渡されるその他の引数。
まだ正しくprototype
ディスパッチされていないようです:setClass
あるいは
のヘルプ ページで、デフォルト値/プロトタイプに関連するものは他に見つかりませんでしたsetRefClass
。
これはバグですか、それともここで明らかな何かが欠けていますか?
編集
デフォルト値を述べるのに役立つ最も近いものは です$initFields()
。
これは?setRefClass
言わなければならないことです:
指定された引数からオブジェクトのフィールドを初期化します。通常、このメソッドは $initialize() メソッドを持つクラスからのみ呼び出されます。これは、参照クラスのデフォルトの初期化に対応しています。スロットと非参照スーパークラスがある場合、これらも ... 引数で指定できます。
通常、特殊な $initialize() メソッドは独自の計算を実行し、次に $initFields() を呼び出して標準の初期化を実行します。これは、以下の例の matrixViewer クラスに示されています。
ここまでは順調ですね
「デフォルトの初期化ケース」の扱いとして機能します。
ただし、(一部の) フィールド値が初期化時に明示的に指定されている状況を処理できない場合:
回避策
本当に汚いですが、うまくいきます
初期化
それが私が探しているものですが、もっと「組み込み」のものがあると確信していますか?
編集2
全体がもう少し一般的です。メソッドensureDefaultValues
は、他の各クラスが継承するクラスのメソッドである可能性があります。「継承パスをさらに下る」クラスの場合、このメソッドはintialize
メソッド内で簡単に呼び出すことができます。
r - S4の代用()
S4 ジェネリック関数の名前付き引数のみがメソッドで定義されている場合、substitute()
期待どおりに動作します。
ただし、メソッドの定義に追加の名前付き引数を追加すると、substitute()
渡された引数が正しく返されなくなります。
なぜこれが起こるのか、そして最も重要なこととして、それをどのように回避できるのかについての手がかりはありますか?