如何在将R输出导出到TXT文件时修复损坏的格式?

时间:2016-08-31 09:20:27

标签: r performance formatting format

首先,我为提出一个愚蠢的问题而道歉,因为我对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函数输出(每个随机变量xy的1,000个数据)的图如下图所示:

enter image description here

但问题是

  1. 这两个功能在我的机器上运行相对较慢。 操作系统:Windows 10 Pro 64位; 系统型号: HP Pro 3330 MT; 处理器:英特尔酷睿i3-2120 CPU @ 3.30GHz(4个CPU); 内存: 4 GB。
  2. 他们的某些输出格式已被破坏,例如
  3. 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中编写程序时一样。

1 个答案:

答案 0 :(得分:2)

我们可以将循环函数简化为:

write.table(data.frame(x = runif(n, Px1, Px2),
                       y = runif(n, Py1, Py2)),
            "DataZoomRNG1.txt", sep = "\t")

关于“破碎的格式”,它没有被破坏,它是制表符分隔的。 enter image description here

避免使用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进行了解析,forlooprunif输出应该相同:

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