我为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
答案 0 :(得分:2)
R中的函数通常用于按值传递参数,而不是通过引用传递参数。更新传入的变量的值不会在调用环境中更改它们。一般来说,R的方法是让您的函数返回更新的数据。如果要返回多个更新变量,可以使用list
执行此操作。
您将看到人们使用分配给父环境运算符(<<-
)甚至assign
到函数中的全局环境。这种编码风格有效,但它违背了这样的原则,即函数通常不会修改调用环境,并且可能更难以调试并将不同的代码片段集成到更大的项目中。