使用pam()
包中的函数cluster
编写函数时,发现了一个非常特殊的问题。下面的代码是原始函数的简化版本,用于演示该问题:
library(cluster)
Dat=array(data=runif(10*2*20, 0, 50), dim=c(10, 2, 20))
Groups=c(rep("A", 10), rep("B", 10))
#K=3
Test<-function (Dat, Groups, K=3) {
#Transform groups
Groups<-as.factor(Groups)
#Decompose data into Euclidean space
Eucl.Coord<-t(matrix(Dat, (dim(Dat)[1])*2, dim(Dat)[3]))
#Define colour-coding
ColSet<-rainbow(length(levels(Groups)))
Col<-ColSet[match(Groups, levels(Groups))]
#Perform partitional clustering
KMeans<-pam(dist(Eucl.Coord), k=K)
Class<-length(which(KMeans$clustering==as.numeric(Groups)))/length(Groups)
plot(KMeans, which.plot=1, shade=TRUE, col.p=Col, col.txt=Col, col.clus="grey90", main=paste("Correct classification: ", round(Class*100, digits=2), "%", sep=""))
}
Test(Dat=Dat, Groups=Groups, K=3)
现在,问题出在以下地方:当我将Test()
作为函数加载并尝试运行时,出现错误消息
as.matrix(x)中的错误:找不到对象'Eucl.Coord'中的错误 clusplot.partition(x,立场=立场,线条=线条,阴影=阴影,: 没有发现diss或数据,也没有pam(x = dist(Eucl.Coord),k = K)
这似乎暗示pam()
要使用不存在的对象(Eucl.Coord
)。但是,这是件奇怪的事情:当您手动在函数中运行代码时,一切都很好。 Eucl.Coord
已正确创建和使用pam()
。如果您希望在手动运行之后再次使用该功能,因为pam()
会使用在初始运行期间创建的全局变量空间中的Eucl.Coord
。关闭R并尝试再次运行该函数,由于Eucl.Coord
在全局空间中不再存在,因此不再起作用。
我知道Eucl.Coord
的设置正确,因为在实际函数中,其他代码段也可以毫无问题地使用它。好像pam()
并且只有pam()
无法访问在函数中创建的对象。我以前从未见过这种行为。有人可以帮我吗?