【问题标题】:R: Dealing with functions that sometimes crash the R session?R:处理有时会导致 R 会话崩溃的函数?
【发布时间】:2013-04-07 17:38:23
【问题描述】:

有一个 R 函数(我们称之为 MyFunction )有时会导致 R 会话崩溃,但大多数时候它不会。 必须以顺序的方式将此函数应用于大量对象。

for(i in 1:nrow(objects))
{
     result[i] <- MyFunction(objects[i]);
}

我来自 C# 背景 - 其中函数很少会导致“会话”崩溃,程序员通常会在 try - catch 块中包围此类函数调用。但是,在 R 中,我已经看到 一些 函数只会使会话崩溃,而使用 tryCatch 并没有帮助,因为该函数不会导致异常,而是会导致整个会话崩溃;-)

只是想知道“捕捉”崩溃的最佳方法是什么。 我正在考虑编写一个 Python 脚本,从 Python 调用 R 函数(通过其中一个 R-Python 连接器)并在 Python 中捕获 R 崩溃。这行得通吗?
有什么建议吗?

干杯!

【问题讨论】:

  • 您能否提供一些导致会话崩溃的函数示例?根据我的经验,它们非常罕见,通常(总是?)由于 R、R 包或 R 会话链接的外部程序中的错误。
  • 正如@JoshO'Brien 所说,崩溃是一个错误。尝试重现错误,否则您将无法解决问题。另一个建议,如果您有一些警告,请尝试解决它们。
  • 我明白了。但是,函数 MyFunction 来自一些同事,假设他们对此非常有占有欲,他们将函数的“输入”归咎于崩溃的原因(他们说这是因为输入错误/ 低质量 )。然而,除了这个功能,我曾经设法通过 sqldf 包设置了一个 SQL 查询,它确实使 R 会话完全崩溃并且我可以复制。
  • 我应该补充一点,大多数软件维护人员都想知道导致他们的软件崩溃的错误。不了解您的同事,但 sqldf 维护人员可能会喜欢包含使会话崩溃的可重现示例的错误报告。报告此类事情是 OSS 用户回馈社区的一种方式。
  • MyFunction 周围写一个临时包装器,在调用函数之前将输入保存到文件中。崩溃后,启动一个新会话并加载那些“坏”输入。当您可以通过“差/低质量”确定您的同事的意思时(它可能是需要整数的数字数据、数据中的共线性等),开始编写一个高级包装器来检查这些条件和通过stop 优雅地清理数据或错误。这就是我处理至少两个 R 包在太多情况下崩溃的方式:glpkAPIgeometry

标签: r exception crash


【解决方案1】:

使用并行包中的mcparallel 函数在分叉进程中运行该函数。这样,如果 R 崩溃了,只有子进程崩溃,并且向主进程返回错误。如果您想将此功能应用于大量对象并将结果收集到列表中,请使用mclapply

【讨论】:

    【解决方案2】:

    您好,根据我的经验,这种行为非常罕见。您可能不知道有一个调试器可以帮助您一步一步地完成您的功能。

    install.packages('debug') #install the debug package
    library(debug)
    mtrace(myFunctionToBeDebuged) #this function will start the debuger
    mtrace(myFunctionToBeDebuged, FALSE) #to stop the function to be traced
    

    注意:当您在调试器中时,如果您想退出它,请执行qqq()

    【讨论】:

    • 调试器功能似乎不适用于使用 apply 系列的功能。你想知道可以用什么代替吗,谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2018-09-15
    • 2020-12-05
    相关资源
    最近更新 更多