2016-12-15 9 views
0

80要素セットのサブセットを扱うため、非常に計算量の多いコードを最適化しようとしています。深さが未知のネストされたリストに値を格納するR

私が加速したい重要なステップは、ループ内の現在のサブセットがすでに処理されているかどうかを調べることです。現時点では、このサブセットが同じサイズk(基数)の既に処理されたサブセットに含まれているかどうかを確認します。サブセットが既に処理されているかどうか(O(80 choose k)の検索ではなくO(1))をチェックするために、順次リストに入れて徐々に処理されたサブセットを保存するほうがずっと速くなります。

私は何の問題現在のサブセットは扱わサブセットの私のネストされたリストにあるかどうかを確認するための機能をコーディングしなかった:treated[[2]][[5]][[3]]==TRUE

IFF TRUE access(treated, subset=c(2,5,3))戻っはしかし、私は(私のループ内)を格納する方法は考えている私処理されたリストの現在のサブセットtreated[h] <- TRUEここでhは現在のサブセットです(上の例では:h=c(2,5,3)

私が直面している主な問題は、[[..]]の数がさまざまです私のループの中に。 hを80の長さにして80 [[..]]のシーケンスを入れるように、hを完了するのではなく、他の選択肢がありますか?treated[[h[1]]][[h[2]]]...[[h[80]]] <- TRUE

答えて

2

H次いで

"[["(treated, h) 

値のベクトルである場合に再帰的にリスト項目をサブセット。

> a 
[[1]] 
[[1]][[1]] 
[1] 2 

[[1]][[2]] 
[[1]][[2]][[1]] 
[1] 3 

[[2]] 
[1] 1 

次のコマンドは、正しく再帰的リストに項目のサブセットを適用する: 例えば、私は(ない非常に)ネストされたリストを作成

> "[["(a, c(1,2,1)) 
[1] 3 

再帰サブセット化ベクトルの長さができ[[..]]の数を固定せずに変化します。たとえば、同じ構文で2つのレベルの深度をサブセット化すると、次のようになります。

> "[["(a, c(1,2)) 
[[1]] 
[1] 3 
+0

驚くばかり!私はこのコマンドを知らなかった。それは他のものに当てはまるより一般的な構文の一部ですか? – bixiou

+0

Btw、あなたが最初に要素(i、j)を入力しなくても、処理されたネストされたリストに要素(i、j、k)を入力することはないので、あなたのソリューションは私の場合(単独で)機能します。 – bixiou

+1

LISPはRの構造に影響を与えた言語の1つです(実際は私はLISPERではありません)。 LISPでは、すべての演算子が実際に関数です。 Rの場合もそうです。すべての演算子は関数呼び出しです。 –

関連する問題