代码在win7上运行正常,但OSX上存在问题

时间:2012-04-14 08:12:53

标签: macos r statistics plot

我在OSX中执行R-Code时遇到问题。 那是我的代码:

i <- 1
while (i <= 20000) {
  repeat{
    z1=((runif(1,0,1)*2)-1)
    z2=((runif(1,0,1)*2)-1)
    h=z1**2+z2**2
    if((h > 0) && (h <= 1)){break}
   }
  x[i] <- z1
  y[i] <- z2
  q[i] <- h

  i <- i + 1
} 

j <- 1
while (j <= 20000) {
  h=sqrt((-2*ln(q[j]))/q[j])
  p[j] <- h
  j <- j + 1
}

a=x*p
b=y*p
points(a,b, pch=c(20,20),col=c("dark green","red"),cex=0.6)

当我初始化x,y,q,p并使用日志时,它可以正常工作。

但为什么会出现这些错误,为什么呢?

error in x[i] <- z1: object 'x' not fund
error: no function for "ln" fund
error: object 'x' not fund
error: object 'y' not fund

3 个答案:

答案 0 :(得分:4)

这是另一种方法。如果减少迭代执行操作的次数,通常应该更快地编写代码。具体来说,您的所有runif(1,0,1)调用都可以替换为runif()值的一个大向量,然后根据该向量对其进行子集。

我使用@Mark Miller的功能作为起点并进行了以下修改。请注意,如果过采样器保留了前一组随机数的良好值并且仅在n达到fun2 <- function() {...}之前填充,则可以进一步改善这一点,但无论如何这都非常快。对于速度比较,我逐字记录了他的代码并将其包装在fun1 <- function(n, oversample = 1.50){ #oversample over <- ceiling(n * oversample) goodvars <- NA while (length(goodvars) < n){ z1 <- runif(over,-1,1) z2 <- runif(over,-1,1) h <- z1^2 + z2^2 goodvars <- which(h > 0 & h < 1) } goodvars <- goodvars[1:n] x <- z1[goodvars] y <- z2[goodvars] q <- h[goodvars] p <- sqrt((-2 * log(q)) / q) a <- x * p b <- y * p return(cbind(a,b)) } ##Mark's code put into a function fun2 <- function() { i <- 1 x <- rep(NA, 20) y <- rep(NA, 20) q <- rep(NA, 20) p <- rep(NA, 20) while (i <= 20) { repeat{ z1=((runif(1,0,1)*2)-1) z2=((runif(1,0,1)*2)-1) h=z1**2+z2**2 if((h > 0) & (h <= 1)){break} } x[i] <- z1 y[i] <- z2 q[i] <- h i <- i + 1 } j <- 1 while (j <= 20) { h=sqrt((-2*log(q[j]))/q[j]) p[j] <- h j <- j + 1 } a=x*p b=y*p } #Do some speed checking with rbenchmark. Also checkout compiler package for some free speed library(compiler) library(rbenchmark) #Compile functions to see improvements cfun1 <- cmpfun(fun1) cfun2 <- cmpfun(fun2) #run benchmark tests benchmark(fun1(n = 20), fun2(), cfun1(n = 20), cfun2(), replications = 1000, columns=c("test", "elapsed", "relative"), order = "elapsed")

           test elapsed  relative
3 cfun1(n = 20)   0.042  1.000000
1  fun1(n = 20)   0.055  1.309524
4       cfun2()   0.407  9.690476
2        fun2()   0.882 21.000000

结果

test <- fun1(n = 1000)
plot(test)

从新的R会话开始,复制和粘贴上面的代码不会返回错误。这是一个例子:

{{1}}

enter image description here

http://i39.tinypic.com/20qhlac.jpg

答案 1 :(得分:2)

这样做你想要的吗?我:

  1. 添加矢量以存储x,y,q和p。
  2. 将ln更改为log
  3. 添加了一个情节(a,b)声明。
  4. 将20000更改为20以进行调试。
  5. 我没有Mac。

    i <- 1
    
    x <- rep(NA, 20)
    y <- rep(NA, 20)
    q <- rep(NA, 20)
    p <- rep(NA, 20)
    
    while (i <= 20) {
    
    repeat{
        z1=((runif(1,0,1)*2)-1)
        z2=((runif(1,0,1)*2)-1)
        h=z1**2+z2**2
    if((h > 0) & (h <= 1)){break}
     }
    x[i] <- z1
    y[i] <- z2
    q[i] <- h
    
    i <- i + 1
    } 
    
    j <- 1
    while (j <= 20) {
    
    h=sqrt((-2*log(q[j]))/q[j])
    
    p[j] <- h
    
    j <- j + 1
    }
    
    a=x*p
    b=y*p
    plot(a,b)
    points(a,b, pch=c(20,20),col=c("dark green","red"),cex=0.6)
    

答案 2 :(得分:2)

您无法从Windows上的新空工作区启动。 “x”对象必须已存在,否则您也会遇到错误。在Windows和OSX中执行ls(),看看是否有“x”。我把钱存在于Windows中而不是OSX中。