19.5.3 跟踪调试

R和RStudio提供了很好的跟踪运行程序的能力。

R的browser()命令可以用在程序中,

命令进入跟踪调试;

RStudio的源文件显示界面可以用鼠标点击定义跟踪调试位置。

函数定义一般都包含多行,所以一般不在命令行定义函数,

而是把函数定义以及较长的程序写在源程序文件中,

用source命令运行。

用source命令调入运行的程序与在命令行运行的效果基本相同,

这样定义的变量也是全局变量。

考虑如下函数定义:

f

for(i in 1:n){

s

}

}

这个函数定义有许多问题。

用一个测试输入调用f,发现有错误:

print(f(1:5))

## Error in 1:n : NA/NaN参数

简单的函数可以直接仔细检查发现错误,

用cat, print等输出中间结果查找错误。

R提供了一个browser()函数,

在程序中插入对browser()函数的调用,

可以进入跟踪调试状态,

可以实时地查看甚至修改运行时变量的值。

在RStudio的编辑窗口中打开.R源程序文件,

在某一程序行行号左端的空白处用鼠标单击,

就可以设定某一行为端点,

在用source命令运行到该处时就可以进入跟踪调试状态。

加入browser()命令后的程序如:

f

browser()

for(i in 1:n){

s

}

}

程序运行遇到browser()函数或设定的断点时程序进入跟踪调试状态,

命令行的提示符变成“Browse[1]>”。

这个命令行的环境一般不再是全局环境,

而是断点所在的函数的运行环境,

可以看到函数的局部变量。

可以在调试环境中用命令去查看当前定义的变量值、逐个命令地运行,

但是用RStudio则可以更方便地执行这些操作。

在调试命令行,可以使用如下命令:

输入变量名查看变量值;

用n命令或者换行键逐句运行;

用s命令跟踪进调用的函数内部逐句运行;

用f命令快速执行到循环末尾或者函数末尾;

用c命令恢复正常运行,不再跟踪;

用Q命令强行终止程序运行。

进入调试状态后,

RStudio界面提供了相应的支持。

这时RStudio的命令行窗格(Console)将会显示用于控制运行的图标,

包括执行下一语句(Next)、跟踪进入要调用的函数运行(Step into)、执行到函数末尾或者循环末尾(Finish)、不再跟踪继续正常运行(Continue)、终止运行(Stop)。

同时,

在RStudio的Environment窗格中会显示当前执行的命令所在的运行环境的内容,

包括函数内的局部变量;

如果点击其中的下拉菜单还可以显示函数的各层父环境。

在同一窗格中还会显示向后追踪(Traceback),

即函数是如何被调用的。

为调试如上函数f的程序,

在定义中插入对browser()的调用如:

f

browser()

for(i in 1:n){

s

}

}

当在RStudio中调试运行时,

程序编辑窗口将显示当前要运行的程序行,

用命令行窗口(Console)的Next快捷图标可以运行到下一行。

命令行的显示如:

> print(f(1:5))

Called from: eval(expr, p)

Browse[1]> n

debug在D:/disk/projects/Rbookweb/tmp2.R#2: for (i in 1:n) {

s

}

Browse[2]>

继续用“Next”图标运行,命令行结果如:

Browse[2]> n

Error in 1:n : NA/NaN参数

发现是在for(i in 1:n)行遇到未定义的变量n。

在源文件中把出错行改为for(i in 1:length(x)),

再次运行,

发现在运行s

遇到“错误: 找不到对象’s’”。

这是忘记初始化引起的。

在for语句前添加s

f

browser()

s

for(i in 1:length(x)){

s

}

}

再次运行,

在跟踪到循环时,

为了避免繁琐的跟踪过程,

可以用“执行到函数末尾或者循环末尾”快捷图标或命令行的f命令,

或者“Continue”快捷图标或命令行的c命令。

程序不显示错误但是也没有显示结果为NULL而不是我们期望得输入元素之和。

检查可以看出错误是忘记把函数返回值写在函数定义最后。

在函数定义最后添加s一行,

再次运行,程序结果与手工验算结果一致。

函数变成

f

browser()

n

s

for(i in 1:n){

s

}

s

}

自定义函数应该用各种不同输入测试其正确性和稳定性。

比如,上面的函数当自变量x为零长度向量时应该返回0才合适,

但是上面的写法会返回一个numeric(0)结果,

这个结果表示长度为零的向量:

f(numeric(0))

## Called from: f(numeric(0))

## Browse[1]> c

## numeric(0)

程序输入了零长度自变量,

我们期望其输出为零而不是numeric(0)。

在自变量x为零长度时,

函数中for(i in 1:length(x)应该一次都不进入循环,

跟踪运行可以发现实际对i=1和i=0共运行了两轮循环。

把这里的1:length(x)改成seq_along(x)解决了问题,

seq_along(x)生成x的下标序列,

如果x是零长度的则下标序列为零长度向量。

函数不需要修改后,

可以把对browser()的调用删除或注释掉,

在RStudio中关闭断点。

函数最终修改为:

f

s

for(i in seq_along(x)){

s

}

s

}

这里只是用这个简单函数演示如何调试程序,

求向量元素和这个问题本身是不需要我们去定义新函数的,

sum函数本来就是完成这样的功能。

实际上,许多我们认为需要自己编写程序做的事情,

在R网站都能找到别人已经完成的扩展包。

r语言clind函数_19 函数进阶 | R语言教程相关推荐

  1. R语言使用download.file函数下载网络文件到本地(Download File from the Internet)

    R语言使用download.file函数下载网络文件到本地(Download File from the Internet) 目录 R语言使用download.file函数下载网络文件到本地(Down ...

  2. R语言使用trimws函数:trimws函数去除(删除、remove)字符串头尾的空格

    R语言使用trimws函数:trimws函数去除(删除.remove)字符串头尾的空格 目录 R语言使用trimws函数:trimws函数去除(删除.remove)字符串头尾的空格

  3. R语言stringr包str_dup函数字符串多次复制实战

    R语言stringr包str_dup函数字符串多次复制实战 目录 R语言stringr包str_dup函数字符串多次复制实战 #导入stringr包 #仿真数据

  4. R语言使用integrate函数进行函数积分计算实战

    R语言使用integrate函数进行函数积分计算实战 目录 R语言使用integrate函数进行函数积分计算实战 #自定义函数 #积分操作

  5. R语言stringr包str_count函数计算字符串匹配个数实战

    R语言stringr包str_count函数计算字符串匹配个数实战 目录 R语言stringr包str_count函数计算字符串匹配个数实战 #导入stringr包 #仿真数据

  6. R语言ggpubr包ggsummarystats函数可视化分组条形图(自定义分组颜色、添加抖动数据点jitter、误差条)并在X轴标签下方添加分组对应的统计值(样本数N、中位数、四分位数的间距iqr)

    R语言ggpubr包ggsummarystats函数可视化分组条形图(自定义分组颜色.添加抖动数据点jitter.误差条error bar)并在X轴标签下方添加分组对应的统计值(样本数N.中位数med ...

  7. R语言使用t.test函数计算两组独立数据的t检验(Independent t-test)

    R语言使用t.test函数计算两组独立数据的t检验(Independent t-test) 目录 R语言使用t.test函数计算两组独立数据的t检验(Independent t-test) #仿真数据

  8. R语言使用pwr包的pwr.r.test函数对相关信息分析进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、效用值的情况下计算需要的样本量

    R语言使用pwr包的pwr.r.test函数对相关信息分析(Correlations)进行效用分析(power analysis).在已知效应量(effect size).显著性水平(sig).效用值 ...

  9. R语言使用pwr包的pwr.r.test函数对相关信息分析(Correlations)进行效用分析(power analysis)的语法

    R语言使用pwr包的pwr.r.test函数对相关信息分析(Correlations)进行效用分析(power analysis)的语法 目录

  10. R语言plyr包round_any函数将向量数据近似到任意精度实战

    R语言plyr包round_any函数向量将数据近似到任意精度实战 目录 R语言plyr包round_any函数向量将数据近似到任意精度实战 #导入plyr包 #仿真数据

最新文章

  1. 安卓端网页浏览过程中实时更新title的web实现
  2. 处理linux 下nbu只能找到一个驱动器
  3. 1091 线段的重叠
  4. 使用PL/SQL Developer远程连接到oracle11g
  5. 编解码技术学习网站汇总
  6. JS报错修改日记(1):Uncaught ReferenceError: showQRcode is not defined
  7. IMX6的相关音频结构体的定义
  8. ios个推透传消息json接收不到_消息通讯——Websocket
  9. java8 stream 做累加_Java8新特性之Stream(上)|乐字节
  10. MySql 插入数据中文乱码
  11. c语言编译生成cpp,C语言的编译过程
  12. python脚本去除文件名里的空格
  13. 剑指Offer字符串加法问题
  14. java jxdatepicker_在Java Swingx中修剪JXDatePicker
  15. JavaScript巧学巧用
  16. NPS 服务器证书:配置模板和自动注册(一)
  17. element的form表单中如何一行显示多el-form-item标签
  18. xml--通过DOM解析XML
  19. 电驴无法增加服务器怎么办,电驴连接不上服务器是什么原因?介绍原因及解决方法步骤...
  20. Unity模型与动画

热门文章

  1. 华为折叠手机是鸿蒙系统吗,华为发布新一代折叠屏手机 将首批升级鸿蒙系统...
  2. MQL5中的错误处理和日志记录
  3. 【第007问 Unity中如何进行UV动画?】
  4. 计算机二级c语言必看,计算机二级C语言考试必看技巧
  5. Ubuntu 18.04 LTS版本 GoldenDict安装与配置
  6. 多益网络校招 —— web前端笔试题
  7. 哈夫曼树与哈夫曼编码
  8. 2011年河南省国民经济和社会发展统计公报
  9. python gui与pyside
  10. CentOS7 安装aria2