在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)
}