産婦人科フクロウ blog 〜PhDからプロの研究者を目指して〜人のまねをせずに、その身に応じ、武器は自分の使いやすいものでなければならぬ

基礎の発生学、細胞物理学について勉強したことを載せていきます。古武道鍛錬中。GitHub;hidem1990

debug

折角習ったので、debug()を使ってみる

 

例題

f1 <- function(x){

  # sum-up elements of x

  a <- 0

  n <- length(x)

  for(i in 1:n) a <- a+x[i]

  # calculation of mean

  b <- a/length(x)

  # calculating variance

  v <- 0

  for(i in 1:v){

    v <- v + (x[i]-b)^2/n

  }

  

  

  new.x <- (x-b)/sqrt(v)

  return(newx)

}

> x<-c(1,2,3,4,5)

> x1<-f1(x)

以下にエラー f1(x) :  オブジェクト'newx'がありません 

f1 <- function(x){

  +     a <- 0

  +     n <- length(x)

  +     for(i in 1:n) a <- a+x[i]

  +     b <- a/length(x)

  +     v <- 0

  +     for(i in 1:v){

    +         v <- v + (x[i]-b)^2/n

    +     }

  +     new.x <- (x-b)/sqrt(v)

  +     return(new.x)

  + }

debug(f1)

> f1(x)

debuggingin: f1(x)

#1 の debug: {

a <- 0

n <- length(x)

for (i in 1:n) a <- a + x[i]

b <- a/length(x)

v <- 0

for (i in 1:v) {

  v <- v + (x[i] - b)^2/n

}

new.x <- (x - b)/sqrt(v)

return(new.x)

}

Browse[2]> 

  #2 の debug: a <- 0

  Browse[2]> 

  #3 の debug: n <- length(x)

  Browse[2]> a

[1] 0

Browse[2]> n

#4 の debug: for (i in 1:n) a <- a + x[i]

Browse[2]> a

[1] 0

Browse[2]> 

  #5 の debug: b <- a/length(x)

  Browse[2]> a

[1] 15

Browse[2]> 

  #6 の debug: v <- 0

  Browse[2]> b

[1] 3

Browse[2]> 

  #7 の debug: for (i in 1:v) {

  v <- v + (x[i] - b)^2/n

}

Browse[2]> v

[1] 0

Browse[2]> 

  #7 の debug: i

  Browse[2]> v

[1] 0

Browse[2]> i

NULL

Browse[2]> 

  #8 の debug: v <- v + (x[i] - b)^2/n

  Browse[2]> i

[1] 1

Browse[2]> v

[1] 0

Browse[2]> 

  #7 の debug: i

  Browse[2]> v

[1] 0.8

Browse[2]> 

  #8 の debug: v <- v + (x[i] - b)^2/n#ここで一気にループが飛んだ!

  Browse[2]> 

  #10 の debug: new.x <- (x - b)/sqrt(v)

  Browse[2]> 

  #11 の debug: return(new.x)

  Browse[2]> v

numeric(0)

Browse[2]> 

  exitingfrom: f1(x)

numeric(0)

> undebug(f1)

f2<- function(x){

  a <- 0

  n <- length(x)

  for(i in 1:n) a <- a+x[i]

  b <- a/length(x)

  v <- 0

  for(i in 1:n){

    v <- v + (x[i]-b)^2/n

  }

   new.x <- (x-b)/sqrt(v)

  return(new.x)

}

 

#実験

> x1<-f1(x)

> x1

[1] -1.4142136-0.7071068  0.0000000  0.7071068  1.4142136

> mean(x1)

[1] 0

> var(x1)*4/5

[1] 1

> x2<-runif(10)

> mean(x3)

[1] 7.214281e-17

> var(x3)*9/10

[1] 1

> x4<-c(0,0,0,0,0)

> x5<-f1(x4)

> mean(x5)

[1] NaN

> x5

[1] NaNNaNNaNNaNNaN

> x6<-c(0,0,0,1)

> x7<-f1(x6)

> mean(x6)

[1] 0.25

> mean(x7)

[1] -2.775558e-17

> var(x7)*3/4

[1] 1

 

この(0,0,0,0)の処理をどうしようか