【问题标题】:How can I make R's output more verbose so as to reassure me that it hasn't broken yet?我怎样才能使 R 的输出更详细,以便让我确信它还没有损坏?
【发布时间】:2020-08-05 18:33:17
【问题描述】:

我经常运行占用大量 RAM 的代码,并且可能需要长达一个小时才能给出输出。通常,我会花半个小时来运行这样的代码,我会担心出现问题。有什么方法可以让 R 向我保证还没有任何错误?我想我可以将里程碑放入代码本身,但我想知道 R(或 RStudio)中是否有任何东西可以在运行时自动完成这项工作。例如,查看代码使用了多少内存会很方便,因为这样我就会放心,只要我看到内存使用量显着变化,它仍然可以工作。

【问题讨论】:

  • 你可以添加一个进度条作为指示器。此外,您还可以使用 stopifnot() 语句,如果出现问题则停止运行循环。
  • “使用内存”不是一个安全的(或好的,IMO)衡量标准,表明事情仍在进行中;例如,由于适当地扩展矩阵或框架,R 可能会消耗更多内存......或者它可能正在爆炸内存并即将崩溃 OOM。我所知道的唯一方法知道您的代码仍在推进它以放入某种形式的手动指示器,无论是使用utils::txtProgressBar(或类似的包)之类的东西,还是一些日志记录,例如message(...)logger 包。
  • 我个人是logger 包的粉丝,在昂贵的区域注入了几个logger::log_debuglogger::log_trace,所以我知道事情正在取得进展,而logger::log_info 在顶级位置.
  • @RYoda 有时是,但通常不是。它通常是一个用户编写的函数,其中包含许多函数。
  • 我猜主要是因为“记录”和“进度指示”略有不同。我使用的另一种技术是添加message(".",appendLF=FALSE),它在循环进行时在屏幕上提供. 的无CRLF 字符串。对于快速移动,我会经常使用诸如i <- i+1; if (i%%100 == 0) message(".",appendLF=TRUE) 之类的计数器。但在我看来,这似乎更像是一个 hack,而不是你问 “R 中是否有任何东西可以自动完成这项工作”。这也没有表明内存使用情况,我怀疑只有分析将在 R 中支持(当前)。

标签: r memory verbosity


【解决方案1】:

你可能会喜欢我的包裹{boomer}

如果你rig()你的函数,它的所有调用都会在代码执行时被分解并打印出来。

例如

# remotes::install_github("moodymudskipper/boomer")
fun <- function(x) {
  x <- x + 1
  Sys.sleep(3)
  x + 1
}

library(boomer)

# rig() the function and all the calls will be exploded
# and displayed as they're run
rig(fun)(2)

【讨论】:

    【解决方案2】:

    一种方法是:

    1. 制作一个包含所有要运行的东西的独立文件,
    2. 采购它并在代码完成时收到警告,可能有错误。

    下面的小函数warn_me

    • 运行位于“路径”中的源文件
    • 如果出现错误,可能会捕获错误
    • 跑步结束时播放声音
    • 发送电子邮件报告运行状态:正常或失败
    • 可选:播放声音直到您停止它,这样您就不会错过它的结束

    这里是:

    warn_me = function(path, annoying = FALSE){
        # The run
        info = try(source(path))
        
        # Sound telling it's over
        library(beepr)
        beep()
        
        # Send an email with status
        library(mailR)
        msg = if(inherits(info, "try-error")) "The run failed" else "It's over, all went well"
        
        send.mail(from = "me@somewhere.com",
                  to = "me@somewhere.com",
                  subject = msg,
                  body = "All is in the title.",
                  smtp = list(host.name = "smtp.mailtrap.io", port = 25,
                              user.name = "********",
                              passwd = "******", ssl = TRUE),
                  authenticate = TRUE,
                  send = TRUE)
        
        if(annoying){
            while(TRUE){
                beepr::beep()
                Sys.sleep(1)
            }
        }
    }
    
    warn_me(path)
    

    我自己没有测试包mailR,但任何电子邮件发送包都可以。请参阅此excellent page on sending emails in R 了解替代方案。

    【讨论】:

      【解决方案3】:

      如果您在 RStudio 中运行 R 脚本文件,请使用“Source with Echo”选项(Ctrl+Shift+Enter,或通过下拉菜单)。

      【讨论】:

      • 我不明白为什么这会产生任何影响。你有什么特定类型的代码吗?
      猜你喜欢
      • 2020-07-29
      • 2012-08-02
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2021-05-27
      • 2015-12-23
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多