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啊嗚,終于說完了,希望說清楚了...
總結
以上是生活随笔為你收集整理的linux 如何运行r脚本,Linux系统下如何debug R脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 系统的内核,[科普] Lin
- 下一篇: linux 权限中加号,关于Linux中