> system.time(fibo(30)) user system elapsed 4.27 0.02 4.36 > system.time(fiboR(30)) user system elapsed 6.65 0.00 6.70 0480132人目の素数さん2018/08/09(木) 17:47:22.65ID:l1M8GWWv cumsumを再帰関数で書いてみた。
> (mat=matrix(sample(0:1,12,rep=T),3,4)) [,1] [,2] [,3] [,4] [1,] 1 1 0 1 [2,] 0 1 0 0 [3,] 1 0 0 1 > print(ifelse(mat==1,'Right','Wrong'),quote=F) [,1] [,2] [,3] [,4] [1,] Right Right Wrong Right [2,] Wrong Right Wrong Wrong [3,] Right Wrong Wrong Right > 0489132人目の素数さん2018/08/11(土) 18:04:43.46ID:05wxJPem RやSPSSって名前の試験まであるのね 0490132人目の素数さん2018/08/22(水) 14:02:15.21ID:rznk0lAS 規約分数にするパッケージが探せなかったので自分でスクリプトを組んでみた。 エラー処置は省略。
reduce_fraction <- function(x,y){ a=x b=y r = a%%b # a=bq+r -> a%%b=b%%r while(r){ a = b b = r r = a%%b } gcd=b cat(x/gcd,'/',y/gcd,'\n') invisible(c(x/gcd,y/gcd)) }
> reverse <- function(x){ + if(!length(x)) return(NULL) + c(Recall(x[-1]),x[1]) + } > cat(reverse(LETTERS[1:26])) Z Y X W V U T S R Q P O N M L K J I H G F E D C B A 0510132人目の素数さん2018/09/09(日) 23:21:54.06ID:1udV8jVZ>>509 なぜ if (length(x) == 0) と書かないのか? 可読性って知ってるか? 0511132人目の素数さん2018/09/10(月) 16:54:23.64ID:89eIPezd>>510 文脈読めば !length(x)で空白ベクトル の流れ 0512132人目の素数さん2018/09/10(月) 18:22:05.74ID:gLTPxqtw>>511 length は数値を返す関数なのに、なぜわざわざ論理演算をするんだ? プログラムは、ここの議論を知らない人が読む可能性のほうが高いんだぞ。 0513132人目の素数さん2018/09/10(月) 19:12:52.95ID:ZYY4OYkH>>512 正規分布が一様分布より大きい期待値の算出に mean(rnorm(100)>runif(100)) って書かない? 俺は sum(ifelse(rnorm(100)>runif(100),1,0))/100 って書いたりしないけど。 0514132人目の素数さん2018/09/10(月) 19:43:25.60ID:SKQ8XoAj>>512 え、常套手段やん?! 0515132人目の素数さん2018/09/10(月) 19:50:35.36ID:ZYY4OYkH>>514 論理値を数値に置き換えて計算しているから 数値を論理値にしても別に違和感がない。 可読性は慣れの問題。 0516132人目の素数さん2018/09/10(月) 19:54:17.32ID:SKQ8XoAj>>515 アンカー間違えとる? だから、そんなの常套手段やん? 0517132人目の素数さん2018/09/10(月) 21:30:23.37ID:gLTPxqtw>>513 それとこれとは話が別だ。 logical は TRUE か FALSE の二値しかとらないから、それから数値への変換は自明。 多種の値をとる数値に論理演算をするのはいただけない。 0518132人目の素数さん2018/09/10(月) 21:36:20.92ID:gLTPxqtw>>515 is.empty.vector のような関数があるならそれでよいが、length を使っているのだから、それを勝手にベクトルが空かどうかの判断に使っているのはあなたであって、他人はそのようには考えない、といっているのだ。 自分だけしかこーどを見ないならべつに構わないが、こういうところに晒すのはよくない。 ましてや常套手段などと言って他人に教え込むのはやめてもらいたい。 0519132人目の素数さん2018/09/10(月) 21:51:19.40ID:5QS5/GHY>>518 常套手段というのはmeanの話じゃね? 0520132人目の素数さん2018/09/10(月) 21:55:50.32ID:5QS5/GHY whileの中は1でも2でもよくね?
> base:::rev.default function (x) if (length(x)) x[length(x):1L] else x 0522132人目の素数さん2018/09/10(月) 22:18:05.27ID:DJR6mPp+>>518 >521みた? if(length(x)!=0)になってないよ。 0523132人目の素数さん2018/09/11(火) 00:19:39.45ID:WPUC3B84>>518 >こういうところ 誰も鵜呑みにしない便所の落書き。。。 0524132人目の素数さん2018/09/11(火) 08:48:42.34ID:QUqp/jpE !を引数が数値のときは0か否かを返す関数と理解すれば if(!0) print(!1)の結果もサクッとわかる。 0525132人目の素数さん2018/09/11(火) 09:08:32.20ID:QUqp/jpE 数値を非零かどうか論理値に変換して処理するかは 関数によるな。
if やwhileは変換処理しているけど whichだとエラーになるな。
> which(!0) [1] 1 > which(0) Error in which(0) : argument to 'which' is not logical > which(2) Error in which(2) : argument to 'which' is not logical > which(!3) integer(0) > 0526132人目の素数さん2018/09/11(火) 09:12:56.04ID:QUqp/jpE !ってベクトル対応しているな > which(!(-1:1)) [1] 2 > !(-2:2) [1] FALSE FALSE TRUE FALSE FALSE 0527132人目の素数さん2018/09/15(土) 08:05:49.52ID:Vl7XZ52q !をnotではなくis.falseとかis.zero変換すれば( ・∀・)イイ!! 0528132人目の素数さん2018/09/15(土) 16:42:00.50ID:h0gUCZ3r>>527 is.zero だと? だったら最初から == 0 てよいじゃないか。 0529132人目の素数さん2018/09/15(土) 16:45:38.59ID:h0gUCZ3r>>525 だいたい、if や while は関数じゃないし。 while (1) などと書くのはCに毒されているんじゃねーの? Rなら while (TRUE) のほうが良いし、repeat というのもある。 0530132人目の素数さん2018/09/15(土) 16:45:41.31ID:Vl7XZ52q>>528 スクリプトを読むときに脳内変換する癖をつけておけば 可読性が悪いと思わずにすむ。 0531132人目の素数さん2018/09/15(土) 16:46:13.42ID:Vl7XZ52q>>518 >521みた? if(length(x)!=0)になってないよ。 0532132人目の素数さん2018/09/15(土) 17:19:35.45ID:h0gUCZ3r>>531 Rのライブラリ?の書き方なんてあてにならないよ。 そもそも、rev も 509 の reverse も演算の回数を必要最低限にするなら、条件は length(x)) >= 2 または > 1 だ。 まあ if (length(x)) のほうが速かったのかも知れないが、常にそうなるとは限らないのだから、早すぎる最適化は諸悪の根源だ。 0533132人目の素数さん2018/09/15(土) 19:30:34.55ID:Vl7XZ52q 可読性の次は速度かよ。 自分の流儀と違う { の使い方でも文句いいそう。 0534132人目の素数さん2018/09/15(土) 19:44:27.43ID:VibLIqgl 0,1を1000万個作って ! != > == での真偽判定を各々10回する時間を出してみた。
> x=rbinom(1e7,1,0.5) > system.time(replicate(10,!x)) user system elapsed 1.27 0.33 1.59 > system.time(replicate(10,x!=0)) user system elapsed 2.39 0.36 2.75 > system.time(replicate(10,x>0)) user system elapsed 2.58 0.31 2.92 > system.time(replicate(10,x==1)) user system elapsed 2.60 0.36 2.99 0535132人目の素数さん2018/09/15(土) 19:57:45.72ID:VibLIqgl !x と x!=0 で10回やったが、
結果は、 > system.time(mean(replicate(1e4,mhs(sample(0:1,100,rep=T))>=5))) user system elapsed 4.56 0.01 4.61 > system.time(mean(replicate(1e4,seqn()))) user system elapsed 1.05 0.00 1.07
> system.time(mean(replicate(1e4,seqn()))) user system elapsed 4.290 0.000 4.377 >system.time(mean(replicate(1e4,max(rle(rbinom(100,1,0.5))$len)>=5))) user system elapsed 3.620 0.000 3.742 > system.time(mean(replicate(1e4,mhs(rbinom(100,1,0.5)>=5)))) user system elapsed 2.390 0.000 2.435 > system.time(searchseq()) user system elapsed 1.880 0.000 1.988 0556132人目の素数さん2018/11/08(木) 23:35:10.38ID:/ZlhhGjJ>>555 greplの逆転はsampleをrbinomに変えたためでしょう。
> system.time(replicate(1e5,sample(0:1,100,rep=T))) user system elapsed 7.200 0.180 7.591 > system.time(replicate(1e5,rbinom(100,1,0.5))) user system elapsed 5.980 0.230 6.319 0557132人目の素数さん2018/11/09(金) 00:20:12.33ID:BZRFS9lT 不勉強ながらrle関数って初めて知ったけど使いやすそうだな