2015-06-27 52 views
0

我爲dbscan算法編寫了代碼。 當我打電話主 功能它不工作,我不知道爲什麼R中未調用的函數

這裏是代碼

x=read.delim("C:/Users/mf/Desktop/stp.txt") 
y=read.delim("C:/Users/mf/Desktop/stp.txt") 

hash=0 
c=temp1=0 
q=1 
C=0 
eps=30 
MinPts=30 

lable=matrix(-2,1,nrow(x)) 
clusterlab=matrix(-3,1,nrow(x)) 


for(p in 1:nrow(x)) 
{ 
    if(lable[p]==-2) 
{ 
    lable[p]=1 #visited=1 and nonvisited=-2 
    NeighborPts = regionQuery(p, eps) 

    temp=nrow(NeighborPts)-1 

    if (temp < MinPts){ 

      clusterlab[p]=0 #noise = 0 


    } 
    else if(temp>=MinPts){ 

      C = C+1 
      haha=expandCluster(p, NeighborPts, C, eps, MinPts,hash,clusterlab,lable) 

    } 

    } 
} 




expandCluster <- function(p, NeighborPts, C, eps, MinPts,hash,clusterlab,lable) { 
    hash=hash+1 
clusterlab[p]=C 

for (q in 2:nrow(NeighborPts)) 
    { testP=NeighborPts[q,1] 

     if(lable[testP]==-2) 
     lable[testP]=1 

     newNeighborPts = regionQuery(testP, eps) 



     if ((nrow(newNeighborPts)-1) >= MinPts) 
      NeighborPts = rbind(NeighborPts,newNeighborPts) 

     if(clusterlab[testP]==-3) #is not yet member of any cluster 
     clusterlab[testP]=C 
    } 
return(hash) 
} 




regionQuery <- function(p, eps) { 

    neighborhood=p 
for(i in 1:nrow(x)){ 
     temp=sqrt((x[p,1]-y[i,1])^2+(x[p,2]-y[i,2])^2) 
     if(temp<eps){ 
     c=c+1 
     neighborhood=rbind(neighborhood,i)} 

     } 
#neighborhood=neighborhood[-1,] 
return(neighborhood) 
} 

當我打電話

haha=expandCluster(p, NeighborPts, C, eps, MinPts,hash,clusterlab,lable) 

它不工作!

我添加散列變量來檢查它。每次expancdCLuster調用hash時都必須增加。但它增加了。

lable和clusterlab也不會改變。

數據中的R here

+0

我們沒有數據來運行這個,regionQuery函數在哪裏? – Spacedman

+0

對不起,現在我編輯它, – knifer

回答

2

函數通常被設計爲通過值參數,而不是通過引用。更新傳入變量的值不會在調用環境中更改它們。一般來說,執行此操作的R方法是讓您的函數返回更新的數據。如果您想要返回多個更新的變量,則可以使用list來執行此操作。

您將看到人們正在使用分配給家長環境操作員(<<-)甚至assign來訪問全球環境中的功能。這種編碼風格很有用,但是它違背了函數通常不會修改調用環境的原則,並且可能會使得更難以調試和將不同代碼片段集成到更大的項目中。