日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發(fā)布時(shí)間:2025/3/20 linux 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 如何运行r脚本,Linux系统下如何debug R脚本 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果是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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。