【问题标题】:Platform-dependent data output平台相关数据输出
【发布时间】:2014-04-08 19:23:15
【问题描述】:

为了帮助自己显示调试信息,我决定创建以下小函数,该函数将动态在 RStudio 的内部数据浏览器中显示数据和简单的基于字符的输出之间切换,具体取决于 功能,我的模块的来源:

View <- function (...) {
  if (.Platform$GUI == "RStudio")
    View(...)
  else
    print(...)
}

此函数与其他实用程序函数一起位于模块&lt;PROJ_HOME&gt;/utils/debug.R 中。所有需要这些功能的模块,通过source("../utils/debug.R")包含它。

在我的 Amazon EC2 实例的 Linux 控制台上运行我的项目代码很好。但是,通过 RStudio Server 在同一虚拟机上运行它会导致以下错误消息:

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?

在我看来,R 对需要调用哪个 View() 函数感到困惑。最初,我假设 RStudio 重载 utils::View() 并尝试显式调用它,但失败了。然后我认为 RStudio 以某种方式在全局环境中定义了它的 View() 实现,因此它只需要在没有包/库引用的情况下调用 View()。但是,正如我所见,它也不起作用。该错误的另一个潜在原因可能是我在使用 ... 参数方面高估了 R 的“智能”。

那么,出了什么问题以及如何解决?

【问题讨论】:

  • 在你的函数中显式调用 utils::View(...) 怎么样?
  • @KarlForner:刚刚发现你的评论。我试过utils::View(...) 调用,但它会导致以下错误和警告:"Error in .External2(C_dataviewer, x, title) : invalid device In addition: Warning message: In utils::View(...) : unable to open display"。这是在 RStudio Server 中运行我的代码。

标签: r debugging rstudio overloading rstudio-server


【解决方案1】:

RStudio 挂钩 View 函数。一种方法可能是查看是否有人从 utils 覆盖了 View 函数,如果存在则调用覆盖。那这个呢?

View <- if (identical(utils::View, View)) print else View

【讨论】:

  • 感谢您的建议,乔纳森!但是,您的方法会导致与我在上面对 Karl 的评论中提到的相同的错误和警告。
  • 乔纳森,请忽略我之前的评论 - 我意识到我正在测试您的更改而没有清除 R 环境(工作区)。当我在正确清除工作区后测试您的代码时,它完全按照我的计划在两个平台上运行良好。做得好!再次感谢你!回答采纳!因此,从您的回答中,我得出结论,R 允许使用省略 (...) 参数语法来覆盖函数。正确的?如果您能查看我最近的 R 问题,我将不胜感激:stackoverflow.com/users/2872891/…
  • 您的原始方法创建了一个调用View 的函数。 R 在函数运行时解析函数名称。
  • 修改后的方法有效,因为它复制函数而不是包装它们。复制发生在View 的赋值之前,因此在赋值View 中引用了它之前的定义。
  • R 的一个更令人困惑的特性是能够在不同的环境中存在多个同名的不同变量——要了解在运行时引用的函数/变量,查看在环境绑定(如果您还没有的话):adv-r.had.co.nz/Environments.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多