2017-07-31 8 views
0

数値入力を処理する関数を作成し、各列に対して一連の計算を行います。 Id 'はベクトルと行列の入力をシームレスに処理し、入力と同じクラスを返す関数と似ています。私はこの方法と同じように動作するように探してdiff()作品。これをRで実装するための正規のパターンがありますか、あるいは入力のクラスに対してif/else処理が必要ですか?可変次元入力を扱う正式なパターンR

私は今のところ出ている最高です:

bar <- function(x) { 
    m <- as.matrix(x) 
    m <- apply(m, 2, function(z) log(diff(z))) 
    if (is.null(dim(x))) m <- drop(m) 
    return(m) 
} 
+0

私は少し混乱しています。 'max(diff(x))'を計算したいのであれば、それをベクトルに適用した結果はスカラー(すなわち、ただ一つの数、diffの最大値)とそれを行列に適用した結果ベクトル(行列の各列に1つの数値)です。なぜ、最初のケースでベクトルを返し、2番目のケースで行列を返すのですか?あなたのコードから 'if'行を削除するだけで、必要なものを手に入れませんか? –

+0

@Oriol、悪いです。正しく紹介するための例を更新しました。私が望む実際の計算はかなり関わっており、ここで繰り返す価値があるとは思わない – Ethan

+0

https://stackoverflow.com/questions/13039997/writing-generic-function-for-tables-that-works-when- vect-be-be-be-be-vect?rq = 1 – Ethan

答えて

1

私は標準的なパターンがあることを知りませんが、diff機能が入力さ寸法を計算するために行列であるかどうかをチェックしません(ifを使用して)異なるパスを使用してrの差異を計算し、rを返す前にclass(r) <- oldClass(x)の元のクラスを最後に再適用します。あなたが見ることができるように、それは本質的にあなたがしたものとは大きく異なるわけではありません。

あなたがdiff()の実装を確認したい場合は、あなただけのコンソールでこれを入力することができます。

diff.default 
+0

ありがとうございました。私はそのようなdiffコードを見ることができるかどうかわかりませんでした。私はちょうど彼らのパターンをコピーします – Ethan

関連する問題