2017-10-13 12 views
1

Iは(I = 1をint型; I =サイズ<; I ++の)ため `正しく翻訳` Rで(場合 `サイズ<1 ')

for(i in 1:size) { ... } 

ようなRでループを書くために使用され、思いましたそれは

for(int i = 1; i <= size; i++) { ... } 

の同等であったが、私はちょうど1:size = [1 0]ので、私のコードは完全に間違って動作しますので、もしsize == 0 Rはとにかくループに入ることに気づきました。ということ

標準私は上記のように書いたC forループを翻訳する方法です。その場合、size < 1のプログラムがループに入りませんでしたか?

+1

'IF(サイズ> = 1)のための(I 1:大きさ)である{...}' – jogo

+1

@jogoはい、私は同じ回避策に終わった、これは標準的な方法ですか? – Nisba

+0

C-for-loopのロジックを保存します。 「標準的な方法」とはどういう意味ですか?誰が標準化を定義すべきか? – jogo

答えて

1

あなたはbase::seq_lenを使用することができます。sizeは、例えば、あなたのオブジェクトのいくつかの大きさであると仮定すると

foo <- 2 
bar <- 0 

for (i in seq_len(foo)) {print(i)} 
[1] 1 
[1] 2 
# No output 
for (i in seq_len(bar)) {print(i)} 
2

length(vec)またはnrow(df)は、あなたが以下のようにseq_alongを使用することができます。サイズは元々、ベクトルの長さである場合

x = NULL 
for (i in seq_along(x)) print(x[i]) 
2

、標準的な方法はmyvectorは長さゼロを持っている場合、正しく動作します

for (i in seq_along(myvector)) {...} 

です。あなただからさえ

for (i in seq_along(numeric(size))) {...} 

を行うことができますが、それは確かに、「標準」とはみなされないことになります。

コメントで述べたように(そして別の答えで)より良い方法は

for (i in seq_len(size)) {...} 
+0

2番目の例は冗長で、PoGibasの示唆しているように 'seq_len(size)'を使うのが良いです。 – Tim

関連する問題