【问题标题】:Is there a way to print the number of iteration when running an apply function in R [closed]在R中运行apply函数时有没有办法打印迭代次数[关闭]
【发布时间】:2016-10-03 23:06:46
【问题描述】:

我在一个大数据集上运行了一个 apply-family 函数,所以我想知道是否有办法知道到目前为止这项工作的进展情况、到目前为止查看了多少元素或类似的东西?

【问题讨论】:

  • 查看包pbapply (progress-bar-apply)
  • apply(..., function(x) {print(whatever); do_whatever()})
  • @lukeA 嗯,对 pbapply 印象不是很深刻,它增加了很多开销,比较以下:tbp <- txtProgressBar(1,2000000)x <- lapply(1:2000000,function(y) {setTextProgressBar(tpb,getTxtProgressBar(tpb) + 1);y + 1})x <- pblapply(1:2000000,function(y) y + 1) 后者需要几分钟,前者可能需要 10秒
  • 在flush.console()中使用forloop,见stackoverflow.com/questions/5249317/…

标签: r iteration apply


【解决方案1】:

您可以考虑创建一个全局计数器,并指定何时打印进度,例如,您可以在处理完 10% 的数据时打印通知;

counter <- 0
data <- rnorm(100)
results <- sapply(data, function(x) { 
                  counter <<- counter + 1; 
                  if(counter %in% seq(0, length(y), 10)) 
                      print(paste(counter, "% has been processed"))})

[1] "10 % has been processed"
[1] "20 % has been processed"
[1] "30 % has been processed"
[1] "40 % has been processed"
[1] "50 % has been processed"
[1] "60 % has been processed"
[1] "70 % has been processed"
[1] "80 % has been processed"
[1] "90 % has been processed"
[1] "100 % has been processed"

【讨论】:

  • 为什么不只是print(i)
  • 传递给函数的数据可能比他想看到的更具体。他只是想知道进度,所以最好有一个单独的counter。我这里只是举个例子,实际上他的数据应该比1:5更复杂,不一定能反映进度。
【解决方案2】:

你可以像这样在你正在使用的函数中添加一个打印语句

apply(mtcars,2, function(i) {print(i[1])
mean(i)})

不漂亮,但做你想做的事

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2015-09-05
    • 2021-04-19
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多