R中没有调用的函数

时间:2015-06-27 07:43:38

标签: r dbscan

我为dbscan算法编写了一个代码。 当我在main中调用一个函数时 它不起作用,我不知道为什么

这是代码

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)

它不起作用!!

我添加哈希变量来检查它。 每次expandcdCLuster调用hash都必须加入。但它确实增加了。

lable和clusterlab也没有改变。

数据是 here

1 个答案:

答案 0 :(得分:2)

R中的函数通常用于按值传递参数,而不是通过引用传递参数。更新传入的变量的值不会在调用环境中更改它们。一般来说,R的方法是让您的函数返回更新的数据。如果要返回多个更新变量,可以使用list执行此操作。

您将看到人们使用分配给父环境运算符(<<-)甚至assign到函数中的全局环境。这种编码风格有效,但它违背了这样的原则,即函数通常不会修改调用环境,并且可能更难以调试并将不同的代码片段集成到更大的项目中。