我在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
答案 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}}
答案 1 :(得分:2)
这样做你想要的吗?我:
我没有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中。