在R中重复输出时,如何调整此功能以停止?
假设我们有以下函数:在R中重复输出时,如何调整此功能以停止?,r,function,break,R,Function,Break,假设我们有以下函数:euclid计算欧几里德距离,k_-means实现完整的k-means算法 euclid <- function(points1, points2) { distanceMatrix <- matrix(NA, nrow=dim(points1)[1], ncol=dim(points2)[1]) for(i in 1:nrow(points2)) { distanceMatrix[,i] <- sqrt(rowSums(t(t(points
euclid
计算欧几里德距离,k_-means
实现完整的k-means算法
euclid <- function(points1, points2) {
distanceMatrix <- matrix(NA, nrow=dim(points1)[1], ncol=dim(points2)[1])
for(i in 1:nrow(points2)) {
distanceMatrix[,i] <- sqrt(rowSums(t(t(points1)-points2[i,])^2))
}
distanceMatrix
}
k_means <- function(x, centers, distFun, nItter) {
clusterHistory <- vector(nItter, mode="list")
centerHistory <- vector(nItter, mode="list")
for(i in 1:nItter) {
distsToCenters <- distFun(x, centers)
clusters <- apply(distsToCenters, 1, which.min)
centers <- apply(x, 2, tapply, clusters, mean)
# Saving history
clusterHistory[[i]] <- clusters
centerHistory[[i]] <- centers
}
list(clusters=clusterHistory, centers=centerHistory)
}
test=data # A data.frame
ktest=as.matrix(test) # Turn into a matrix
centers <- ktest[sample(nrow(ktest), 4),] # Sample some centers, 4 for example
result <- k_means(ktest, centers, euclid, 4) # 4 iterations
print(result)
这将持续到(在本例中)指定的4次迭代
但是,我想编辑
k_means
函数,以便在迭代输出相同时停止。您可以在这里看到,这发生在$clusters[[3]]
上,与$clusters[[2]]
相同。但是,$clusters[[4]]
仍然被不必要地打印出来。有人能告诉我具体在哪里编辑这个吗?包括一个break
声明,如下所示:
k_means <- function(x, centers, distFun, nItter) {
clusterHistory <- vector(nItter, mode="list")
centerHistory <- vector(nItter, mode="list")
for(i in 1:nItter) {
distsToCenters <- distFun(x, centers)
clusters <- apply(distsToCenters, 1, which.min)
centers <- apply(x, 2, tapply, clusters, mean)
# Saving history
clusterHistory[[i]] <- clusters
centerHistory[[i]] <- centers
if(i >1){
if(identical(clusterHistory[[i]], clusterHistory[[i-1]])){break} #Stop if duplicated result
}}
list(clusters=clusterHistory, centers=centerHistory)
}
k_的意思是谢谢你,这很有效!一个小的跟进。当中断成功执行时,对于剩余的迭代,它返回NULL
。因此,例如,在最初的帖子中,$clusters[[4]]
仍将在输出中,但会显示NULL
。有没有办法让它不退货?例如,是否可以添加一些内容,以便print()
返回不包含空值的输出?
k_means <- function(x, centers, distFun, nItter) {
clusterHistory <- vector(nItter, mode="list")
centerHistory <- vector(nItter, mode="list")
for(i in 1:nItter) {
distsToCenters <- distFun(x, centers)
clusters <- apply(distsToCenters, 1, which.min)
centers <- apply(x, 2, tapply, clusters, mean)
# Saving history
clusterHistory[[i]] <- clusters
centerHistory[[i]] <- centers
if(i >1){
if(identical(clusterHistory[[i]], clusterHistory[[i-1]])){break} #Stop if duplicated result
}}
list(clusters=clusterHistory, centers=centerHistory)
}