お世話になります。
以下のような多重ループ文を、別の方法で(Rっぽく)書くことはできないでしょうか。
for (i in 1:3) { for (j in seq(11,15,2)) { for (k in seq(101,110,3)) { print(paste(paste(i,j),k)) } } }
よろしくお願いします。
nanami
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
1:3
と seq(11,15,2)
と seq(101,110,3))
の組み合わせは expand.grid()
で得ることが出来ますので、あとは apply()
にて関数適用を行い、print(paste())
を実行すると良いのではないでしょうか
R
1func <- function(x) print(paste(x[1],x[2],x[3])) 2r = apply(expand.grid(1:3, seq(11,15,2), seq(101,110,3)), 1, func)
投稿2018/11/11 05:04
総合スコア15898
0
apply系関数を使うのは常道ですね。
sapply( seq(1:3), function(i){ sapply( seq(11,15,2), function(j){ sapply(seq(101,110,3), function(k){print(paste(i,j,k))}) }) })
ただ、中身が複雑になってくると、みにくくはなります。
よほどスピードが求められるのでない限り、素直にforループを使ったほうがいいと思います。
#速度について
「よほどスピードが求められるのでない限り」とか何となく書いてしまいましたが、実際のところ実行時間に差が出るものか試してみました。
質問文にある程度の組み合わせ量ではどのみち差が出ないので、ループ回数をふやしての実験です。
Rprof(tmp<-tempfile(), interval=0.01) #ii <- 1:3000 #jj <- seq(11,15,2) #kk <- seq(101,110,3) ii <- 1:100 jj <- 1:100 kk <- 1:100 func1 <- function(){ for (i in ii) { for (j in jj) { for (k in kk) { # print(paste(paste(i,j),k)) } } } } func2 <- function(){ sapply(ii, function(i){ sapply(jj, function(j){ sapply(kk, function(k){ # print(paste(i,j,k)) }) }) }) return(invisible()) } func3 <- function(){ apply(expand.grid(ii, jj, kk), 1, function(x){ # print(paste(x[1],x[2],x[3])) }) return(invisible()) } func1() func2() func3() Rprof(NULL) profres <- summaryRprof(tmp) print(profres$by.total[grep("func[1-3]", rownames(profres$by.total)),])
結果は次の通り。
> source("test.r") total.time total.pct self.time self.pct "func3" 3.59 62.87 0.00 0.00 "func2" 2.06 36.08 0.00 0.00 "func1" 0.06 1.05 0.06 1.05
なんとforループがダントツでした。expand.gridではいったんすべての組み合わせをリストアップしたリストを作るため、そのオーバーヘッドが生じていると想像されます。
投稿2018/11/11 04:41
編集2018/11/11 10:30総合スコア13671
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/11 09:55