【问题标题】:Debugging a function in a different source file in R在 R 的不同源文件中调试函数
【发布时间】:2012-09-20 15:43:48
【问题描述】:

我正在使用 RStudio,我希望能够在特定行停止代码执行。

函数在第一个脚本文件中定义并从第二个脚本文件中调用。

我使用source("C:/R/script1.R")将第一个文件导入第二个文件

我使用从头到行运行:从第二个脚本开始运行,该脚本具有函数调用,并在第一个脚本中突出显示了函数定义所在的行。

然后我使用browser() 查看变量。然而,这并不理想,因为涉及到一些大型矩阵。有没有办法让这些变量出现在 RStudio 的工作区中?

此外,当我使用 run from line to end 重新启动时,它只会运行到被调用的第一个脚本文件的末尾,它不会返回调用函数并完成第二个文件的运行。

如何在 RStudio 中实现这些目标?

好的,这里是一个简单的例子,下面的函数加法器是在一个脚本中定义的

adder<-function(a,b) {  
  browser()
  return(a+b)
 }

我比调用来自第二个脚本

x=adder(3,4)

当在第二个脚本中调用 adder 时,在第一个脚本中启动 browser()。从这里我可以使用 get("a") 来获取 a 的值,但是 a 和 b 的值没有出现在 RStudio 的工作区中?

在此处的示例中,这并不重要,但是当您有几个大型矩阵时,它就可以了。

【问题讨论】:

  • 是脚本2报错的问题吗?试试options(error = recover)
  • 抱歉,不确定发生了什么,但我重新启动,现在它返回到调用函数。谢谢休
  • 仍然想知道如何将正在浏览的函数中的变量()添加到 RStudios 工作区。
  • 当您调用browser 时,您只是暂停执行您正在执行的操作。当前环境中的所有变量应自动显示在 RStudio 环境浏览器中。如果您想了解更多细节,请在您的问题中提供一个可重复的示例。
  • 没有问题如何附加脚本文件?

标签: r rstudio


【解决方案1】:

如果您将数据分配到.GlobalEnv,它将显示在 RStudio 的“工作区”选项卡中。

> adder(3, 4)
Called from: adder(3, 4)
Browse[1]> a
[1] 3
Browse[1]> b
[1] 4
Browse[1]> assign('a', a, pos=.GlobalEnv)
Browse[1]> assign('b', b, pos=.GlobalEnv)
Browse[1]> c
[1] 7
> a
[1] 3
> b
[1] 4

【讨论】:

    【解决方案2】:

    您所说的 RStudio 工作区是 R 会话中的全局环境。每个函数都存在于自己的小环境中,不会将其局部变量暴露给全局环境。因此a 不存在于 RStudio 的对象检查器中。

    这是一种良好的编程习惯,因为它可以将较大脚本的各个部分相互屏蔽,从而减少不必要的交互量。例如,如果您在一个函数中使用i 作为计数器,这不会影响另一个函数中计数器i 的值。

    您可以在浏览器会话中使用任何常用功能检查a。例如,

    head(a)
    str(a)
    summary(a)
    View(a)
    attributes(a)
    

    调用browser 后的一个常见策略是获取当前(父)环境中所有变量的摘要。养成每次使用browser 停止代码时,立即在命令行输入ls.str() 的习惯。

    【讨论】:

    • 嗯,我有大型矩阵需要相互比较,这在浏览器会话中不容易做到吗?理想情况下,我可以在工作区中看到它们。是否可以更改 RStudio 的工作区指向的环境?
    • @HughPatience,也许像.ls.objects 这样的东西会有用,而不是 RStudio 的“工作区”选项卡。
    • 您可以使用例如检查命令行上的对象strsummary。这在浏览器会话中工作正常。我自己不使用来自文本编辑器 + 终端背景的对象检查器。
    • @HughPatience 您可以通过&lt;&lt;- 将这些大矩阵“发送”到全球环境(有些特殊情况可能不成立,请参阅?"&lt;&lt;-")。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2018-07-18
    • 2014-04-12
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多