首先,我为提出一个愚蠢的问题而道歉,因为我对R来说比较新。
我已经花了好几个小时来解决这个问题,但我无法做到。我也尝试在Google上搜索一些相关主题,但无济于事。我试图在R中创建一个可以执行a Monte Carlo simulation which can't be properly handled in VBA的函数。以下是我创建的两个函数:
ZoomRNG1 <- function(n,Px1,Px2,Py1,Py2)
{
sink("DataZoomRNG1.txt")
for(i in 1:n)
{
repeat
{
x = runif(1)
y = runif(1)
if(x > Px1 & x < Px2)
{
if(y > Py1 & y < Py2)
{
cat(i, x, y, "\n", sep="\t", append=TRUE);
break
}
}
}
}
sink()
}
和
ZoomRNG2 <- function(n,Px1,Px2,Py1,Py2)
{
logFile = "DataZoomRNG2.txt"
for(i in 1:n)
{
repeat
{
x = runif(1)
y = runif(1)
if(x > Px1 & x < Px2)
{
if(y > Py1 & y < Py2)
{
cat(i, x, y, file=logFile, append=TRUE, "\n", sep="\t");
break
}
}
}
}
}
这两个函数都能正常工作,Excel中ZoomRNG1函数输出(每个随机变量x
和y
的1,000个数据)的图如下图所示:
但问题是
389 0.5067888 0.5064327
390 0.50462 0.5083072
391 0.5040369 0.5075297
392 0.5094 0.5064151
393 0.5068058 0.5041317
394 0.5073923 0.5002383
如上所述,线390和392的格式被破坏(其他一些线也被破坏)。如何解决这个问题?另外,有没有办法让两个函数运行得更快?有点像(可能?)首先在数组/向量中写入函数的输出,然后将结果导出到外部文件,就像我在VBA中编写程序时一样。
答案 0 :(得分:2)
我们可以将循环函数简化为:
write.table(data.frame(x = runif(n, Px1, Px2),
y = runif(n, Py1, Py2)),
"DataZoomRNG1.txt", sep = "\t")
避免使用Excel复制粘贴,改为使用R plot,参见示例:
n = 100
Px1 = 10
Px2 = 20
Py1 = 5
Py2 = 7
set.seed(42)
df1 <- data.frame(x = runif(n, Px1, Px2),
y = runif(n, Py1, Py2))
plot(df1)
由于@Roland使用set.seed进行了解析,forloop
和runif
输出应该相同:
set.seed(42)
for (i in 1:5) print(runif(1))
# [1] 0.914806
# [1] 0.9370754
# [1] 0.2861395
# [1] 0.8304476
# [1] 0.6417455
set.seed(42)
runif(5)
# [1] 0.9148060 0.9370754 0.2861395 0.8304476 0.6417455