【发布时间】: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 包在太多情况下崩溃的方式:glpkAPI和geometry。