linux 如何运行r脚本,Linux系统下如何debug R脚本
如果是ubuntu??opensuse 系統(tǒng) 推薦用Rstudio 。
我們可以輸人help(debug)去查看這函數(shù)的說明及指令。
這里用by.quantiles做例子,逐步展示編寫程序及除錯的過程。
首先,函數(shù)by.quantiles可以把向量x分成任何數(shù)目n的分位數(shù)(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)。這些數(shù)字代表在x內(nèi)相應(yīng)的元素是屬于第幾個分位。
R有內(nèi)置函數(shù)quantile,它能讀取向量形式的數(shù)據(jù)及概率切點(diǎn)(probability breakpoints)向量(二分位數(shù)時(shí)是c(0,0.5,1);四分位數(shù)時(shí)是c(0,0.25,0.5,0.75,1)等)及傳回?cái)?shù)據(jù)的分位數(shù)切點(diǎn)。quantile函數(shù)就是by.quantiles核心所在。它的語法及內(nèi)容如下:
by. quantiles=function(x,n)
{
產(chǎn)生n分位數(shù)的概率切點(diǎn)向量
利用函數(shù)quartile來產(chǎn)生真正的切點(diǎn)
根據(jù)所得的切點(diǎn),把數(shù)據(jù)x細(xì)分為n分位數(shù)。
傳回結(jié)果
}
首先,我們逐步編寫by. quartiles;我們需明白如何產(chǎn)生概率切點(diǎn)。概率切點(diǎn)是一個向量,其起始為0,終結(jié)為1。把數(shù)據(jù)分成兩部分的向量含有3個元素(0,0.5,1),而把數(shù)據(jù)分為四部分的向量含有五個元素(0,0.25,0.5,0.75,l),所以我們可得出把數(shù)據(jù)分為n部分的向量會含有n+1個元索。我們可利用rep函數(shù)來建立這個向量。我們最好分開來測試函數(shù)的每一部分,直到我們確定所有部分都相互協(xié)調(diào)。首先我們輸人:
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'參數(shù)不對
以上例子中,第1個自變量應(yīng)為x,而第二個自變量應(yīng)為n才對。更正這個錯誤后再執(zhí)行,便會輸出“[1] 0 0 1",到目前為止,仍看似正確無誤。現(xiàn)在,我們需設(shè)法找出向量中間所包含的數(shù)值,其中一個方法是利用for循環(huán)。我們只需知道向量的首個及最尾的數(shù)值,然后逐一加人中間的數(shù)值。在二分位數(shù)的例子中,向量以1為計(jì)算單位:〔0,0.5 , 1 );而在四分位數(shù)的例子中,則以1/4為計(jì)算單位(0,0.25,0.5,0.75,1)。因此在n分位數(shù)的情況下,向量應(yīng)以1/n為計(jì)算單位。
利用fix( by. quanttles)函數(shù)來變更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
這看來并不正確,因第二個數(shù)值應(yīng)是0。我們再輸入不同的測試程序,好讓我們對于問題所在有更清晰的了解:
> by.quantiles(c(1,2,3,4),4)
[1] 0.00 0.25 0.25 0.00 1.00
這里有兩個問題:一是0出現(xiàn)于1之前,而數(shù)字并沒有遞增,原來是由于我們在for循環(huán)中用了n一1而不是n。向量含有n +1個元素,因此第二最后元素應(yīng)為n。另一個問題是來自pbreaks=1/n一行。我們是想在這方程式的右邊得到出現(xiàn)某處的i之?dāng)?shù)值。更正for循環(huán)的執(zhí)行范圍應(yīng)可解決第一個問題。同時(shí),讓我們嘗試用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
應(yīng)該用(i-1)/n才對~更正這錯誤后,函數(shù)的這部分便可正常運(yù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下一步是利用函數(shù)quantile來計(jì)算數(shù)據(jù)中每個分位數(shù)的切點(diǎn)。輸人help( quantile)可找到這函數(shù)的用法。為避免每次測試程序時(shí)都要重新輸人數(shù)據(jù),我們把數(shù)據(jù)儲存為sample
sample=c(0.42,0.15,0.25,0.27,0.35,0.38,0.41,0.1)
我們加入函數(shù)quantile來測試sample??當(dāng)n =4時(shí),所傳回的值應(yīng)類似(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把數(shù)據(jù)以分位數(shù)寫人。我們需要做的是核查x的每個元素是否在某兩個切點(diǎn)之間,若是便歸納于相對應(yīng)的分位。
開始時(shí),我們先建立n+1個0,然后利用for循環(huán)把它們逐個加人。實(shí)際上,我們需要兩個for循環(huán):一個用來讀取數(shù)據(jù)內(nèi)的每個元素,另一個則把每個元素與分位數(shù)逐一比較。這即是說,就算該元素己被安置到正確的分位數(shù)組別,它亦會繼續(xù)與其“白分位數(shù)比較。其實(shí)也可編寫一個較快的循環(huán),在安置元素到正確的分位數(shù)組別之后,便終比運(yùn)作。但編寫這個函數(shù)相當(dāng)復(fù)雜~
這兩個for循環(huán)(一個根據(jù)i,另一個根據(jù)j)會含有一個if敘述,用以確定某元素是否屬于第j個分位數(shù)組別。如果條件正確,該元素對應(yīng)的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為什么結(jié)果不是與原來的數(shù)據(jù)一樣長呢?讓我們利用debug來找尋for循環(huán)中的錯處所在。(而且,為何O會出現(xiàn)?)
> 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,的長度應(yīng)與x相同,而不是與dbreaks的長度相同。這代表i應(yīng)由1至length(x)。更改這錯誤之后,結(jié)果看來稍為好些,但仍未能正常運(yùn)作:
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來查看錯在何處。輸出的結(jié)果應(yīng)是(4,1,2,2,3,3,4,1),那么為何函數(shù)只會產(chǎn)生0而不是4呢?或許是由于輸出結(jié)果從0開始吧。那么為何函數(shù)保留0而不產(chǎn)生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從結(jié)果看來,第一個元素是大于或等于第75個百分位數(shù),但不是少于第100個百分位數(shù)。為何會出錯呢?原來測試應(yīng)針對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啊嗚,終于說完了,希望說清楚了...
總結(jié)
以上是生活随笔為你收集整理的linux 如何运行r脚本,Linux系统下如何debug R脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 系统的内核,[科普] Lin
- 下一篇: linux 权限中加号,关于Linux中