裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

プログラム書法-2

2012年01月04日 | ブログラミング

コンピュータ上の実数は近似値である。ただし,2 のべき乗数の和で表される数は正確な値を保持している。整数は全て2のべき乗数の和であるから正確な値を保持している。

> options(digits=20)
> x <- 0.001 # 0.001 は 10 進数では正確な値であるが,2 進数では循環小数となり,正確な値を保持していない
> s <- 0
> for (i in 1:1000) s <- s+x
> s
[1] 1.0000000000000006661
> s == 1 # よって,0.001 を 1000 回足しても 1 にはならない
[1] FALSE

> (x <- 2^(-10)) # 2 の マイナス 10 乗は 10 進数でも,2 進数でも正確な値を保持している
[1] 0.0009765625
> s <- 0
> for (i in 1:1024) s <- s+x
> s
[1] 1
> s == 1 # 1024 回加えると,正確に 1 になる
[1] TRUE

結論:実数変数がある値と等しいかどうかを判定するようなプログラムを書いてはいけない

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

R 用の indent その3

2012年01月04日 | ブログラミング

たぶん,最終的に用いているのは皆同じプログラムなんだろうけど,Sweave を使う例も挙げておこう。

<<>>=
test<-function(x,y,z) {
n<-length(x) # 日本語のコメント
result<-numeric(n)
for (i in 1:n) {
result[i]<-(x[i]+y[i])*z[i]
}
return(result)
}
@

を含む *.Rnw を \SweaveOpts{keep.source=FALSE} で Sweave すると,以下のようなチャンクを含む *.tex ファイル(もちろん最終的には,*.pdf ファイルなど)ができる。
">" や "+"  は options(prompt = " ", continue = " ") で,空白にすることができる(空にはできないようだ)。
ただしこの場合も,コメント行はすっかりとなくなる

> test <- function(x, y, z) {
+     n <- length(x)
+     result <- numeric(n)
+     for (i in 1:n) {
+         result[i] <- (x[i] + y[i]) * z[i]
+     }
+     return(result)
+ }

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

R 用の indent その2

2012年01月04日 | ブログラミング

formatR パッケージの tidy.souce 関数を使う。この方法では,コメントはちゃんと残る。

元のプログラム(encoding: utf-8

test<-function(x,y,z) {
n<-length(x) # 日本語のコメント
result<-numeric(n)
for (i in 1:n) {
result[i]<-(x[i]+y[i])*z[i]
}
return(result)
}

> library(formatR)
> tidy.source("testsource.R")
test <- function(x, y, z) {
    n <- length(x)  # 日本語のコメント
    result <- numeric(n)
    for (i in 1:n) {
        result[i] <- (x[i] + y[i]) * z[i]

    }
    return(result)
}

整形すべきプログラムをクリップボードにコピーして,tidy.source() とするのが最も簡単。

tidy.dir は,指定したディレクトリ中の全ての R ファイルを tidy.source を使って整形する

tidy.gui は,tidy.source を呼ぶ GUI システムを提供する

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

R 用の indent その1

2012年01月04日 | ブログラミング

source("プログラムファイル.R", keep.source=FALSE)
dump("関数名", file="新プログラムファイル.R")

難点 元のプログラムについている注釈が全部なくなる

元のプログラム testsource.R

test<-function(x,y,z){
n<-length(x)
result<-numeric(n)
for(i in 1:n){result[i]<-(x[i]+y[i])*z[i]}
return(result)}

source("testsource.R", keep.source=FALSE)
dump("test", file="new.testsource.R")

インデントされたプログラム new.testsource.R

test <-
function (x, y, z)
{
    n <- length(x)
    result <- numeric(n)
    for (i in 1:n) {
        result[i] <- (x[i] + y[i]) * z[i]
    }
    return(result)
}

同じようなことであるが,以下のようにしてもよい

> source("testsource.R", keep.source=TRUE)
> print(test)
function(x,y,z){
n<-length(x)
result<-numeric(n)
for(i in 1:n){result[i]<-(x[i]+y[i])*z[i]}
return(result)}
> print(test, useSource=FALSE)
function (x, y, z)
{
    n <- length(x)
    result <- numeric(n)
    for (i in 1:n) {
        result[i] <- (x[i] + y[i]) * z[i]
    }
    return(result)
}

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村