调试R中不同源文件中的函数

时间:2012-09-20 15:43:49

标签: r rstudio

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

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

我使用source("C:/R/script1.R")

将第一个文件导入第二个文件

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

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

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

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

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

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

我打电话来自第二个剧本

x=adder(3,4)

在第二个脚本中调用adder时,在第一个脚本中启动browser()。从这里我可以使用get(&#34; a&#34;)来获取a的值,但a和b的值不会出现在RStudio的工作区中?

在这里的示例中,它并不重要,但是当你有几个大矩阵时,它确实存在。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:2)

如果您将数据分配到.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