资源描述:
《R语言入门十三章、十四章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第十三章调试案例:寻找连续为1的游程findruns1<-function(x,k){n<-length(x)runs<-vector(length=n)count<-0for(iin1:(n-k+1)){if(all(x[i:i+k-1]==1)){count<-count+1runs[count]<-i}}if(count>0){runs<-runs[1:count]}elseruns<-NULLreturn(runs)}findruns1(c(1,0,0,1,1,0,0,1,1,1),2)[1]34789显然,出错了调试方法一:
2、手动,在程序中添加多个print(),把程序的内部细节输出来查看是哪里出的问题。function(x,k){print(x)#输出xprint(k)#输出kn<-length(x)print(n)#输出nruns<-vector(length=n)count<-0for(iin1:(n-k+1)){if(all(x[i:i+k-1]==1)){count<-count+1runs[count]<-iprint(runs)#输出循环的每一步}}if(count>0){runs<-runs[1:count]print(runs)#输出结果
3、}elseruns<-NULLreturn(runs)}findruns1(c(1,0,0,1,1,0,0,1,1,1),2)[1]1001100111#正确[1]2#正确[1]10#正确[1]3000000000#出错!![1]3400000000[1]3470000000[1]3478000000[1]3478900000[1]34789[1]34789可以看出,从把实参带入形参,到建立长度等于x长度d的向量,都是正确的。错误开始于循环的第一步。因此我们应该去检查循环语句,不难发现,问题出在all(x[i:i+k-1]==1)中,
4、我们没有把i+k-1扩起来。调试方法二:使用R的调试工具在代码中插入print()显然比较繁琐,特别是程序较长的时候,使用R的调试工具会更便捷。R的核心调试工具有浏览器构成,它可以让你逐行运行代码,并在运行过程中检查,可以用dubug(f)或browser()打开这个浏览器。debug(f)函数可以把函数f()设置成调试状态,意味着每次调用f()都会进入这一状态,取消这一状态需调用undebug(f)。在2.10版本之后,可以用debugonce()代替(检查漏洞一次)。debugonce(findruns1)findruns1(c(
5、1,0,0,1,1,0,0,1,1,1),2)然后开始调试….Browse[2]>x[1]1001100111Browse[2]>debugatfindruns1.R#2:n<-length(x)Browse[2]>debugatfindruns1.R#3:runs<-vector(length=n)Browse[2]>print(n)[1]10Browse[2]>debugatfindruns1.R#4:count<-0Browse[2]>debugatfindruns1.R#5:for(iin1:(n-k+1)){if(all(x
6、[i:i+k-1]==1)){count<-count+1runs[count]<-i}}Browse[2]>debugatfindruns1.R#5:iBrowse[2]>debugatfindruns1.R#6:if(all(x[i:i+k-1]==1)){count<-count+1runs[count]<-i}Browse[2]>x[i:i+k-1]#出错[1]0Browse[2]>i:i+k-1[1]2Browse[2]>i[1]1Browse[2]>k[1]2Browse[2]>Q#退出调试思考后可以发现,少加了括号。so
7、urce("findruns.R")>findruns(c(1,0,0,1,1,0,0,1,1,1),2)[1]489正确。下面这个案例是用递归算法排序qs<-function(x){if(length(x)<=1)return(x)pivot<-x[1]therest<-x[-1]sv1<-therest[therest=pivot]sv1<-qs(sv1)sv2<-qs(sv2)return(c(sv1,pivot,sv2))}a<-c(8,7,2,9,45,32)sourc
8、e("qs.R")>a<-c(8,7,2,9,45,32)>qs(a)[1]27893245结果是正确的,但运算过程是比较让人费解的。本人要说明的是,调试工具不仅可以找错,也可以帮助理解程序的运行过程。debugonce