【问题标题】:Too large output in RR中的输出太大
【发布时间】:2017-04-29 19:51:23
【问题描述】:

我正在 RStudio 中编写一个 for 循环程序。

当我使用以下命令时,

a <- 10
for (i in c(1:10335) { 
    a <- a + 0.005
    print(a)
}

我在控制台中得到一个非常大的输出,因为循环运行了 10335 次。大输出也是总输出的一小部分(最后一个值,可能是 1000 左右)。我还在控制台中丢失了我编写的程序。我该如何解决这个问题?如何在输出中获得完整的 10335 个值?

另外,有没有办法以 excel 或文本格式导出此输出?

【问题讨论】:

  • 你想要输出什么,你的输出对于你拥有的循环来说是自然的
  • 您不是在源文件窗格中输入代码并从那里执行吗?
  • 你的意图是什么?尝试a &lt;- 10out &lt;- 10 + c(0:9)*0.005 并查看out。也许你也应该看看seq
  • 您可以将输出保存到文件中。您可以将输出存储在一个向量(或矩阵或数据框)中,该向量可以导出(例如作为 csv 文件),然后导入 Excel。如果将输出存储到向量中,则可以使用 View 函数对其进行检查。正如您所发现的,拥有数千个打印语句很少有帮助。
  • @nrussell 不,我试图在控制台中执行此操作。即使使用源文件窗格,我在控制台中也遇到了同样的问题。

标签: r for-loop


【解决方案1】:

您可以将它们添加到现有向量中,而不是打印这些值:

a <- 10
results <- vector(length = 10335)
for (i in c(1:10335)) {
a <- a + 0.005
results[i] <- a
}

str(results)
num [1:10335] 10 10 10 10 10 ...

您可以使用 write.table 将结果保存到文本文件:

write.table(results, file = "results.txt", row.names = FALSE, col.names = FALSE)

【讨论】:

  • 不要这样做——为向量预先分配空间。您刚刚将线性算法转换为二次算法。
  • 无论长度是否预先分配,修改时是否都复制了整个向量?
  • 不,不是。如果事情以这种方式工作,R 将是一种非常缓慢的语言。请参阅接受的答案:stackoverflow.com/q/12464379/4996248,了解如何使用vector 进行预分配。否则,您的答案非常好。如果您对其进行调整,我会赞成(顺便说一句,反对的不是我)。
【解决方案2】:

我们可以使用seq()避免for循环:

# using seq instead of forloop
res <- seq(from = 10 + 0.005, to = 10 + 10335 * 0.005, by = 0.005)
# and write to a file
write.table(res, "temp_seq.txt", col.names = FALSE, row.names = FALSE)

或者如果我们必须使用循环然后使用sink()函数:

# using loop and sink the output to a file
sink("temp_loop.txt")
a <- 10
for (i in c(1:10335)) { 
  a <- a + 0.005
  print(a)
}
sink()

在这两种情况下,我们都将输出写入文件,因为 RStudio 控制台对打印有限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多