linux 如何运行r脚本,Linux系统下如何debug R脚本

如果是ubuntu  opensuse 系统 推荐用Rstudio 。

我们可以输人help(debug)去查看这函数的说明及指令。

这里用by.quantiles做例子,逐步展示编写程序及除错的过程。

首先,函数by.quantiles可以把向量x分成任何数目n的分位数(quantiles)假如x是c( 0.42, .15, .7, .35 , .38, .41, .1),那么by. quarntiles (x ,2), quartiles(x ,4),分别会传回向量(2,1,1,1,2,2,2,1) 及(4,1,2,2,3,3,4,1)。这些数字代表在x内相应的元素是属于第几个分位。

R有内置函数quantile,它能读取向量形式的数据及概率切点(probability breakpoints)向量(二分位数时是c(0,0.5,1);四分位数时是c(0,0.25,0.5,0.75,1)等)及传回数据的分位数切点。quantile函数就是by.quantiles核心所在。它的语法及内容如下:

by. quantiles=function(x,n)

{

产生n分位数的概率切点向量

利用函数quartile来产生真正的切点

根据所得的切点,把数据x细分为n分位数。

传回结果

}

首先,我们逐步编写by. quartiles;我们需明白如何产生概率切点。概率切点是一个向量,其起始为0,终结为1。把数据分成两部分的向量含有3个元素(0,0.5,1),而把数据分为四部分的向量含有五个元素(0,0.25,0.5,0.75,l),所以我们可得出把数据分为n部分的向量会含有n+1个元索。我们可利用rep函数来建立这个向量。我们最好分开来测试函数的每一部分,直到我们确定所有部分都相互协调。首先我们输人:

by.quantiles=function(n,x){

pbreaks=rep(0,n+1)

pbreaks[n+1]=1;

pbreaks;

}

> by.quantiles(c(1,2,3,4),2)

错误于rep(0, n + 1) : 'times'参数不对

以上例子中,第1个自变量应为x,而第二个自变量应为n才对。更正这个错误后再执行,便会输出“[1] 0 0 1",到目前为止,仍看似正确无误。现在,我们需设法找出向量中间所包含的数值,其中一个方法是利用for循环。我们只需知道向量的首个及最尾的数值,然后逐一加人中间的数值。在二分位数的例子中,向量以1为计算单位:〔0,0.5 , 1 );而在四分位数的例子中,则以1/4为计算单位(0,0.25,0.5,0.75,1)。因此在n分位数的情况下,向量应以1/n为计算单位。

利用fix( by. quanttles)函数来变更by. qutiles如下:

by.quantiles=function(x,n){

pbreaks=rep(0,n+1)

pbreaks[n+1]=1;

for(i in 2:n-1))

pbreaks=1/n;

pbreaks;

}

我们再测试一下这个例子> by.quantiles(c(1,2,3,4),2)

[1] 0.5 0.5 1.0

这看来并不正确,因第二个数值应是0。我们再输入不同的测试程序,好让我们对于问题所在有更清晰的了解:

> by.quantiles(c(1,2,3,4),4)

[1] 0.00 0.25 0.25 0.00 1.00

这里有两个问题:一是0出现于1之前,而数字并没有递增,原来是由于我们在for循环中用了n一1而不是n。向量含有n +1个元素,因此第二最后元素应为n。另一个问题是来自pbreaks=1/n一行。我们是想在这方程式的右边得到出现某处的i之数值。更正for循环的执行范围应可解决第一个问题。同时,让我们尝试用i/n来代替1/n来解决第二个问题。> by.quantiles(c(1,2,3,4),2)

[1] 0 1 1

> by.quantiles(c(1,2,3,4),4)

[1] 0.00 0.50 0.75 1.00 1.00

应该用(i-1)/n才对~更正这错误后,函数的这部分便可正常运作:

function(x,n){

pbreaks=rep(0,n+1)

pbreaks[n+1]=1;

for(i in 2:n)

pbreaks=(i-1)/n;

pbreaks;

}

> by.quantiles(c(1,2,3,4),4)

[1] 0.00 0.25 0.50 0.75 1.00下一步是利用函数quantile来计算数据中每个分位数的切点。输人help( quantile)可找到这函数的用法。为避免每次测试程序时都要重新输人数据,我们把数据储存为sample

sample=c(0.42,0.15,0.25,0.27,0.35,0.38,0.41,0.1)

我们加入函数quantile来测试sample  当n =4时,所传回的值应类似(0.1,0.2,0.3,0.4,0.5)

by.quantiles=function(x,n){

pbreaks=rep(0,n+1)

pbreaks[n+1]=1;

for(i in 2:n)

pbreaks=(i-1)/n;

dbreaks=quantile(x,probs=pbreaks)

dbreaks;

}

> by.quantiles(sample,4)

0%    25%    50%    75%   100%

0.1000  0.2250   0.3100    0.3875    0.4200这看似正确。下一步要利用dbreaks把数据以分位数写人。我们需要做的是核查x的每个元素是否在某两个切点之间,若是便归纳于相对应的分位。

开始时,我们先建立n+1个0,然后利用for循环把它们逐个加人。实际上,我们需要两个for循环:一个用来读取数据内的每个元素,另一个则把每个元素与分位数逐一比较。这即是说,就算该元素己被安置到正确的分位数组别,它亦会继续与其“白分位数比较。其实也可编写一个较快的循环,在安置元素到正确的分位数组别之后,便终比运作。但编写这个函数相当复杂~

这两个for循环(一个根据i,另一个根据j)会含有一个if叙述,用以确定某元素是否属于第j个分位数组别。如果条件正确,该元素对应的j的值便会被记录。

by.quantiles=function(x,n){

pbreaks=rep(0,n+1)

pbreaks[n+1]=1;

for(i in 2:n)

pbreaks=(i-1)/n;

dbreaks=quantile(x,probs=pbreaks)

data.by.quantiles=rep(0,n+1);

for(i in 1:n+1))

for(j in 1:n)

if(x>=dbreaks[j]&x

data.by.quantiles=j

data.by.quantiles;

}

> by.quantiles(sample,4)

[1] 0 1 2 2 3为什么结果不是与原来的数据一样长呢?让我们利用debug来找寻for循环中的错处所在。(而且,为何O会出现?)

> debug(by.quantiles)

> by.quantiles(sample,4)

debugging in: by.quantiles(sample, 4)

debug: {

pbreaks = rep(0, n + 1)

pbreaks[n + 1] = 1

for (i in 2:n) pbreaks= (i - 1)/n

dbreaks = quantile(x, probs = pbreaks)

data.by.quantiles = rep(0, n + 1)

for (i in 1:n + 1)) for (j in 1:n) if (x>= dbreaks[j] &

x< dbreaks[j + 1])

data.by.quantiles= j

data.by.quantiles

}

Browse[2]> n

debug: pbreaks = rep(0, n + 1)

Browse[2]> n

debug: pbreaks[n + 1] = 1

Browse[2]> n

debug: for (i in 2:n) pbreaks= (i - 1)/n

Browse[2]> n

debug: dbreaks = quantile(x, probs = pbreaks)

Browse[2]> n

debug: data.by.quantiles = rep(0, n + 1)

Browse[2]> n

debug: for (i in 1:n + 1)) for (j in 1:n) if (x>= dbreaks[j] &

x< dbreaks[j + 1]) data.by.quantiles= j

Browse[2]> n

debug: NULL

Browse[2]> x

[1] 0.42 0.15 0.25 0.27 0.35 0.38 0.41 0.10

Browse[2]> dbreaks

0%    25%    50%    75%   100%

0.1000 0.2250 0.3100 0.3875 0.4200

Browse[2]> data.by.quantiles

[1] 0 0 0 0 0

Browse[2]> Q向量data.by.quantiles,的长度应与x相同,而不是与dbreaks的长度相同。这代表i应由1至length(x)。更改这错误之后,结果看来稍为好些,但仍未能正常运作:

by.quantiles=function(x,n){

pbreaks=rep(0,n+1)

pbreaks[n+1]=1;

for(i in 2:n)

pbreaks=(i-1)/n;

dbreaks=quantile(x,probs=pbreaks)

data.by.quantiles=rep(0,n+1);

for(i in 1:length(x))

for(j in 1:n)

if(x>=dbreaks[j]&x

data.by.quantiles=j

data.by.quantiles;

}

> by.quantiles(sample,4)

[1] 0 1 2 2 3 3 4 1再次利用debug来查看错在何处。输出的结果应是(4,1,2,2,3,3,4,1),那么为何函数只会产生0而不是4呢?或许是由于输出结果从0开始吧。那么为何函数保留0而不产生4呢?

> debug(by.quantiles)

> by.quantiles(sample,4)

debugging in: by.quantiles(sample, 4)

debug: {

pbreaks = rep(0, n + 1)

pbreaks[n + 1] = 1

for (i in 2:n) pbreaks= (i - 1)/n

dbreaks = quantile(x, probs = pbreaks)

data.by.quantiles = rep(0, n + 1)

for (i in 1:length(x)) for (j in 1:n) if (x>= dbreaks[j] &

x< dbreaks[j + 1])

data.by.quantiles= j

data.by.quantiles

}

Browse[2]>

debug: pbreaks = rep(0, n + 1)

Browse[2]>

debug: pbreaks[n + 1] = 1

Browse[2]>

debug: for (i in 2:n) pbreaks= (i - 1)/n

Browse[2]>

debug: dbreaks = quantile(x, probs = pbreaks)

Browse[2]>

debug: data.by.quantiles = rep(0, n + 1)

Browse[2]>

debug: for (i in 1:length(x)) for (j in 1:n) if (x>= dbreaks[j] &

x< dbreaks[j + 1]) data.by.quantiles= j

Browse[2]>

debug: NULL

Browse[2]> x[1]

[1] 0.42

Browse[2]> dbreaks[4]

75%

0.3875

Browse[2]> dbreaks[5]

100%

0.42从结果看来,第一个元素是大于或等于第75个百分位数,但不是少于第100个百分位数。为何会出错呢?原来测试应针对x是否小于或等于(<=)dbreaks[j+1],而不是绝对小于(

pbreaks=rep(0,n+1)

pbreaks[n+1]=1;

for(i in 2:n)

pbreaks=(i-1)/n;

dbreaks=quantile(x,probs=pbreaks)

data.by.quantiles=rep(0,n+1);

for(i in 1:length(x))

for(j in 1:n)

if(x>=dbreaks[j]&x<=dbreaks[j+1])

data.by.quantiles=j

data.by.quantiles;

}

> by.quantiles(sample,4)

[1] 4 1 2 2 3 3 4 1啊呜,终于说完了,希望说清楚了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值