2012-03-06 14 views
0

以下のループはblocを変更します。 sapply()でも同じ結果が得られますか?サプリーと環境

つまり、sapply()は基本環境の変数を更新できますか?私はassign()を使ってみましたが、成功しませんでした。ありがとうございました。

n <- 100 
fencePosts <- c(17,34) 
bloc <- rep(0,n) 
for (i in 1:length(fencePosts)){ 
    bloc[fencePosts[i]:n] = i 
} 
table(bloc) 

私は次の行のようなものを考えて、もちろんblocの(私は、これは「bloc見つかりません」というエラーが発生しない理由はわからないが)範囲外であるました。

zilch <- sapply(1:length(fencePosts),function(i)bloc[fencePosts[i]:n] = i) 

答えて

1

私はそれがR-pertsにどれだけコーシャ知りませんが、あなたが、私は、私はこの方法を使用しても、可能であればsapply見ていませんでした

zilch <- sapply(1:length(fencePosts),function(i)bloc[fencePosts[i]:n] <<- i) 
+0

私はこれを時々行いますが、 'bloc'や' sapply() 'の呼び出しは、' bloc'などを引数とする小さな関数で呼び出すことができます。変更した 'ブロック 'を返します –

3

を行うことができますそれが良い考えであるかどうかは分かりません。 sapplyの主な用途は、リストのさまざまな要素に対して同じタスクを実行し、結果を有用な方法で収集することです。これはその用法とは一致しないので、たとえ可能であっても、コードを読んで維持することは難しいと思う。 rep使用しない理由は、この特定のケースでは、

bloc <- rep(seq_len(length(fencePosts)+1), diff(c(1,fencePosts,n+1)) 

なぜ機能しないのかについては、スコープと関連があります。 1つの良いリファレンスは、ジョンフォックスの: http://cran.r-project.org/doc/contrib/Fox-Companion/appendix-scope.pdfです。この場合

+0

例とリンクの両方に感謝します。 –

0

、あなたは本当にループ内またはsapply内の任意の割り当て を必要としません。

関連する問題